aigroup-workflow 1.3.0 → 2.0.1
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/.claude/commands/fix-build.md +32 -0
- package/.claude/commands/git-commit.md +1 -1
- package/.claude/commands/init-project.md +66 -50
- package/.claude/commands/plan.md +32 -0
- package/.claude/commands/review.md +29 -0
- package/.claude/commands/tdd.md +32 -0
- package/.claude/commands/workflow-start.md +87 -0
- package/.claude/hooks.json +3 -3
- package/.claude-plugin/plugin.json +20 -0
- package/.codex/AGENTS.md +107 -0
- package/.codex/agents/docs-researcher.toml +14 -0
- package/.codex/agents/explorer.toml +14 -0
- package/.codex/agents/reviewer.toml +16 -0
- package/.codex/config.toml +93 -0
- package/.codex-plugin/plugin.json +33 -0
- package/AGENTS.md +76 -0
- package/CLAUDE.md +18 -83
- package/README.md +220 -317
- package/agents/a11y-architect.md +141 -0
- package/agents/architect.md +211 -0
- package/agents/build-error-resolver.md +114 -0
- package/agents/chief-of-staff.md +151 -0
- package/agents/code-architect.md +71 -0
- package/agents/code-explorer.md +69 -0
- package/agents/code-reviewer.md +237 -0
- package/agents/code-simplifier.md +47 -0
- package/agents/comment-analyzer.md +45 -0
- package/agents/conversation-analyzer.md +52 -0
- package/agents/cpp-build-resolver.md +90 -0
- package/agents/cpp-reviewer.md +72 -0
- package/agents/csharp-reviewer.md +101 -0
- package/agents/dart-build-resolver.md +201 -0
- package/agents/database-reviewer.md +91 -0
- package/agents/doc-updater.md +107 -0
- package/agents/docs-lookup.md +68 -0
- package/agents/e2e-runner.md +107 -0
- package/agents/flutter-reviewer.md +243 -0
- package/agents/gan-evaluator.md +209 -0
- package/agents/gan-generator.md +131 -0
- package/agents/gan-planner.md +99 -0
- package/agents/go-build-resolver.md +94 -0
- package/agents/go-reviewer.md +76 -0
- package/agents/harness-optimizer.md +35 -0
- package/agents/healthcare-reviewer.md +83 -0
- package/agents/init-architect.md +185 -0
- package/agents/java-build-resolver.md +153 -0
- package/agents/java-reviewer.md +92 -0
- package/agents/kotlin-build-resolver.md +118 -0
- package/agents/kotlin-reviewer.md +159 -0
- package/agents/loop-operator.md +36 -0
- package/agents/opensource-forker.md +198 -0
- package/agents/opensource-packager.md +249 -0
- package/agents/opensource-sanitizer.md +188 -0
- package/agents/performance-optimizer.md +446 -0
- package/agents/planner.md +212 -0
- package/agents/pr-test-analyzer.md +45 -0
- package/agents/python-reviewer.md +98 -0
- package/agents/pytorch-build-resolver.md +120 -0
- package/agents/refactor-cleaner.md +85 -0
- package/agents/rust-build-resolver.md +148 -0
- package/agents/rust-reviewer.md +94 -0
- package/agents/security-reviewer.md +108 -0
- package/agents/seo-specialist.md +62 -0
- package/agents/silent-failure-hunter.md +50 -0
- package/agents/tdd-guide.md +91 -0
- package/agents/type-design-analyzer.md +41 -0
- package/agents/typescript-reviewer.md +112 -0
- package/cli/commands/check.mjs +11 -19
- package/cli/commands/init.mjs +133 -49
- package/cli/commands/status.mjs +42 -39
- package/cli/commands/update.mjs +10 -12
- package/cli/utils/scaffold.mjs +298 -127
- package/docs/README.md +46 -29
- package/docs/red-flags.md +29 -24
- package/docs/rules/README.md +51 -0
- package/docs/rules/agents.md +50 -0
- package/docs/rules/coding-style.md +79 -0
- package/docs/rules/cpp/coding-style.md +44 -0
- package/docs/rules/cpp/hooks.md +39 -0
- package/docs/rules/cpp/patterns.md +51 -0
- package/docs/rules/cpp/security.md +51 -0
- package/docs/rules/cpp/testing.md +44 -0
- package/docs/rules/csharp/coding-style.md +72 -0
- package/docs/rules/csharp/hooks.md +25 -0
- package/docs/rules/csharp/patterns.md +50 -0
- package/docs/rules/csharp/security.md +58 -0
- package/docs/rules/csharp/testing.md +46 -0
- package/docs/rules/dart/coding-style.md +159 -0
- package/docs/rules/dart/hooks.md +66 -0
- package/docs/rules/dart/patterns.md +261 -0
- package/docs/rules/dart/security.md +135 -0
- package/docs/rules/dart/testing.md +215 -0
- package/docs/rules/git-workflow.md +53 -0
- package/docs/rules/golang/coding-style.md +32 -0
- package/docs/rules/golang/hooks.md +17 -0
- package/docs/rules/golang/patterns.md +45 -0
- package/docs/rules/golang/security.md +34 -0
- package/docs/rules/golang/testing.md +31 -0
- package/docs/rules/hooks.md +61 -0
- package/docs/rules/java/coding-style.md +114 -0
- package/docs/rules/java/hooks.md +18 -0
- package/docs/rules/java/patterns.md +146 -0
- package/docs/rules/java/security.md +100 -0
- package/docs/rules/java/testing.md +131 -0
- package/docs/rules/kotlin/coding-style.md +86 -0
- package/docs/rules/kotlin/hooks.md +17 -0
- package/docs/rules/kotlin/patterns.md +146 -0
- package/docs/rules/kotlin/security.md +82 -0
- package/docs/rules/kotlin/testing.md +128 -0
- package/docs/rules/performance.md +30 -0
- package/docs/rules/perl/coding-style.md +46 -0
- package/docs/rules/perl/hooks.md +22 -0
- package/docs/rules/perl/patterns.md +76 -0
- package/docs/rules/perl/security.md +69 -0
- package/docs/rules/perl/testing.md +54 -0
- package/docs/rules/php/coding-style.md +40 -0
- package/docs/rules/php/hooks.md +24 -0
- package/docs/rules/php/patterns.md +33 -0
- package/docs/rules/php/security.md +37 -0
- package/docs/rules/php/testing.md +39 -0
- package/docs/rules/python/coding-style.md +42 -0
- package/docs/rules/python/hooks.md +19 -0
- package/docs/rules/python/patterns.md +39 -0
- package/docs/rules/python/security.md +30 -0
- package/docs/rules/python/testing.md +38 -0
- package/docs/rules/rust/coding-style.md +151 -0
- package/docs/rules/rust/hooks.md +16 -0
- package/docs/rules/rust/patterns.md +168 -0
- package/docs/rules/rust/security.md +141 -0
- package/docs/rules/rust/testing.md +154 -0
- package/docs/rules/security.md +73 -0
- package/docs/rules/swift/coding-style.md +47 -0
- package/docs/rules/swift/hooks.md +20 -0
- package/docs/rules/swift/patterns.md +66 -0
- package/docs/rules/swift/security.md +33 -0
- package/docs/rules/swift/testing.md +45 -0
- package/docs/rules/testing.md +77 -0
- package/docs/rules/typescript/coding-style.md +199 -0
- package/docs/rules/typescript/hooks.md +22 -0
- package/docs/rules/typescript/patterns.md +52 -0
- package/docs/rules/typescript/security.md +28 -0
- package/docs/rules/typescript/testing.md +18 -0
- package/docs/rules/web/coding-style.md +96 -0
- package/docs/rules/web/design-quality.md +63 -0
- package/docs/rules/web/hooks.md +120 -0
- package/docs/rules/web/patterns.md +79 -0
- package/docs/rules/web/performance.md +64 -0
- package/docs/rules/web/security.md +57 -0
- package/docs/rules/web/testing.md +55 -0
- package/docs/templates/code-review.md +1 -1
- package/docs/templates/implementation-plan.md +82 -82
- package/docs/workflow-pipeline.md +55 -127
- package/manifests/install-modules.json +294 -0
- package/package.json +8 -3
- package/scripts/harness/log-event.sh +11 -21
- package/scripts/harness/logs-query.sh +3 -8
- package/scripts/harness/tests/test-log-event.sh +16 -31
- package/scripts/harness/tests/test-logs-query.sh +4 -4
- package/scripts/hooks/README.md +49 -0
- package/scripts/hooks/checks/claude-md-size.cjs +21 -0
- package/scripts/hooks/checks/delegation-antipatterns.cjs +66 -0
- package/scripts/hooks/checks/empty-docs.cjs +32 -0
- package/scripts/hooks/checks/orchestration-artifacts.cjs +65 -0
- package/scripts/hooks/checks/structure.cjs +23 -0
- package/scripts/hooks/checks/workflow-state.cjs +56 -0
- package/scripts/hooks/dispatcher.cjs +64 -0
- package/scripts/hooks/lib/runner.cjs +81 -0
- package/scripts/orchestration/lib/orchestrator.cjs +181 -0
- package/scripts/orchestration/session.cjs +180 -0
- package/skills/documentation/SKILL.md +45 -0
- package/skills/{max/workflow/entropy-management → entropy-management}/SKILL.md +115 -124
- package/skills/requirement-engineering/SKILL.md +111 -0
- package/skills/{max/workflow/subagent-driven-development → subagent-driven-development}/SKILL.md +18 -18
- package/skills/{max/workflow/writing-plans → writing-plans}/SKILL.md +165 -165
- package/.claude/agents/ella.md +0 -101
- package/.claude/agents/init-architect.md +0 -128
- package/.claude/agents/jarvis.md +0 -193
- package/.claude/agents/kyle.md +0 -168
- package/docs/ARCHITECTURE.md +0 -117
- package/docs/QUALITY_SCORE.md +0 -44
- package/docs/coding-standards.md +0 -48
- package/docs/dispatch-rules.md +0 -83
- package/docs/steering-loop.md +0 -72
- package/docs/tech-debt-tracker.md +0 -26
- package/docs/templates/memory/activeContext.template.md +0 -30
- package/docs/templates/memory/projectContext.template.md +0 -36
- package/docs/templates/memory/systemPatterns.template.md +0 -26
- package/scripts/check-gitignore.sh +0 -130
- package/scripts/clean-system-files.sh +0 -169
- package/scripts/harness/hook-post-edit.sh +0 -40
- package/scripts/harness/hook-stop.sh +0 -70
- package/scripts/harness/hook-subagent-stop.sh +0 -54
- package/scripts/harness/lint-delegation.sh +0 -168
- package/scripts/harness/lint-docs.sh +0 -121
- package/scripts/harness/lint-process.sh +0 -221
- package/scripts/harness/lint-structure.sh +0 -145
- package/scripts/harness/lint-workflow-artifacts.sh +0 -150
- package/scripts/harness/run-all.sh +0 -77
- package/scripts/harness/workflow-state.sh +0 -397
- package/scripts/update-skills.sh +0 -187
- package/skills/max/workflow/brainstorming/SKILL.md +0 -111
- package/skills/max/workflow/documentation/SKILL.md +0 -82
- package/skills/max/workflow/requirement-validation/SKILL.md +0 -107
- package/skills/max/workflow/solution-design/SKILL.md +0 -117
- package/skills/max/workflow/testing/SKILL.md +0 -118
- /package/{.claude/agents → agents}/get-current-datetime.md +0 -0
- /package/skills/{ella/angular-architect → angular-architect}/SKILL.md +0 -0
- /package/skills/{ella/angular-architect → angular-architect}/references/components.md +0 -0
- /package/skills/{ella/angular-architect → angular-architect}/references/ngrx.md +0 -0
- /package/skills/{ella/angular-architect → angular-architect}/references/routing.md +0 -0
- /package/skills/{ella/angular-architect → angular-architect}/references/rxjs.md +0 -0
- /package/skills/{ella/angular-architect → angular-architect}/references/testing.md +0 -0
- /package/skills/{jarvis/api-designer → api-designer}/SKILL.md +0 -0
- /package/skills/{jarvis/api-designer → api-designer}/references/error-handling.md +0 -0
- /package/skills/{jarvis/api-designer → api-designer}/references/openapi.md +0 -0
- /package/skills/{jarvis/api-designer → api-designer}/references/pagination.md +0 -0
- /package/skills/{jarvis/api-designer → api-designer}/references/rest-patterns.md +0 -0
- /package/skills/{jarvis/api-designer → api-designer}/references/versioning.md +0 -0
- /package/skills/{jarvis/architecture-designer → architecture-designer}/SKILL.md +0 -0
- /package/skills/{jarvis/architecture-designer → architecture-designer}/references/adr-template.md +0 -0
- /package/skills/{jarvis/architecture-designer → architecture-designer}/references/architecture-patterns.md +0 -0
- /package/skills/{jarvis/architecture-designer → architecture-designer}/references/database-selection.md +0 -0
- /package/skills/{jarvis/architecture-designer → architecture-designer}/references/nfr-checklist.md +0 -0
- /package/skills/{jarvis/architecture-designer → architecture-designer}/references/system-design.md +0 -0
- /package/skills/{kyle/chaos-engineer → chaos-engineer}/SKILL.md +0 -0
- /package/skills/{kyle/chaos-engineer → chaos-engineer}/references/chaos-tools.md +0 -0
- /package/skills/{kyle/chaos-engineer → chaos-engineer}/references/experiment-design.md +0 -0
- /package/skills/{kyle/chaos-engineer → chaos-engineer}/references/game-days.md +0 -0
- /package/skills/{kyle/chaos-engineer → chaos-engineer}/references/infrastructure-chaos.md +0 -0
- /package/skills/{kyle/chaos-engineer → chaos-engineer}/references/kubernetes-chaos.md +0 -0
- /package/skills/{jarvis/cli-developer → cli-developer}/SKILL.md +0 -0
- /package/skills/{jarvis/cli-developer → cli-developer}/references/design-patterns.md +0 -0
- /package/skills/{jarvis/cli-developer → cli-developer}/references/go-cli.md +0 -0
- /package/skills/{jarvis/cli-developer → cli-developer}/references/node-cli.md +0 -0
- /package/skills/{jarvis/cli-developer → cli-developer}/references/python-cli.md +0 -0
- /package/skills/{jarvis/cli-developer → cli-developer}/references/ux-patterns.md +0 -0
- /package/skills/{jarvis/cloud-architect → cloud-architect}/SKILL.md +0 -0
- /package/skills/{jarvis/cloud-architect → cloud-architect}/references/aws.md +0 -0
- /package/skills/{jarvis/cloud-architect → cloud-architect}/references/azure.md +0 -0
- /package/skills/{jarvis/cloud-architect → cloud-architect}/references/cost.md +0 -0
- /package/skills/{jarvis/cloud-architect → cloud-architect}/references/gcp.md +0 -0
- /package/skills/{jarvis/cloud-architect → cloud-architect}/references/multi-cloud.md +0 -0
- /package/skills/{jarvis/code-documenter → code-documenter}/SKILL.md +0 -0
- /package/skills/{jarvis/code-documenter → code-documenter}/references/api-docs-fastapi-django.md +0 -0
- /package/skills/{jarvis/code-documenter → code-documenter}/references/api-docs-nestjs-express.md +0 -0
- /package/skills/{jarvis/code-documenter → code-documenter}/references/coverage-reports.md +0 -0
- /package/skills/{jarvis/code-documenter → code-documenter}/references/documentation-systems.md +0 -0
- /package/skills/{jarvis/code-documenter → code-documenter}/references/interactive-api-docs.md +0 -0
- /package/skills/{jarvis/code-documenter → code-documenter}/references/python-docstrings.md +0 -0
- /package/skills/{jarvis/code-documenter → code-documenter}/references/typescript-jsdoc.md +0 -0
- /package/skills/{jarvis/code-documenter → code-documenter}/references/user-guides-tutorials.md +0 -0
- /package/skills/{kyle/code-reviewer → code-reviewer}/SKILL.md +0 -0
- /package/skills/{kyle/code-reviewer → code-reviewer}/references/common-issues.md +0 -0
- /package/skills/{kyle/code-reviewer → code-reviewer}/references/feedback-examples.md +0 -0
- /package/skills/{kyle/code-reviewer → code-reviewer}/references/receiving-feedback.md +0 -0
- /package/skills/{kyle/code-reviewer → code-reviewer}/references/report-template.md +0 -0
- /package/skills/{kyle/code-reviewer → code-reviewer}/references/review-checklist.md +0 -0
- /package/skills/{kyle/code-reviewer → code-reviewer}/references/spec-compliance-review.md +0 -0
- /package/skills/{max/competitive-analysis → competitive-analysis}/SKILL.md +0 -0
- /package/skills/{jarvis/cpp-pro → cpp-pro}/SKILL.md +0 -0
- /package/skills/{jarvis/cpp-pro → cpp-pro}/references/build-tooling.md +0 -0
- /package/skills/{jarvis/cpp-pro → cpp-pro}/references/concurrency.md +0 -0
- /package/skills/{jarvis/cpp-pro → cpp-pro}/references/memory-performance.md +0 -0
- /package/skills/{jarvis/cpp-pro → cpp-pro}/references/modern-cpp.md +0 -0
- /package/skills/{jarvis/cpp-pro → cpp-pro}/references/templates.md +0 -0
- /package/skills/{jarvis/csharp-developer → csharp-developer}/SKILL.md +0 -0
- /package/skills/{jarvis/csharp-developer → csharp-developer}/references/aspnet-core.md +0 -0
- /package/skills/{jarvis/csharp-developer → csharp-developer}/references/blazor.md +0 -0
- /package/skills/{jarvis/csharp-developer → csharp-developer}/references/entity-framework.md +0 -0
- /package/skills/{jarvis/csharp-developer → csharp-developer}/references/modern-csharp.md +0 -0
- /package/skills/{jarvis/csharp-developer → csharp-developer}/references/performance.md +0 -0
- /package/skills/{jarvis/database-optimizer → database-optimizer}/SKILL.md +0 -0
- /package/skills/{jarvis/database-optimizer → database-optimizer}/references/index-strategies.md +0 -0
- /package/skills/{jarvis/database-optimizer → database-optimizer}/references/monitoring-analysis.md +0 -0
- /package/skills/{jarvis/database-optimizer → database-optimizer}/references/mysql-tuning.md +0 -0
- /package/skills/{jarvis/database-optimizer → database-optimizer}/references/postgresql-tuning.md +0 -0
- /package/skills/{jarvis/database-optimizer → database-optimizer}/references/query-optimization.md +0 -0
- /package/skills/{jarvis/debugging-wizard → debugging-wizard}/SKILL.md +0 -0
- /package/skills/{jarvis/debugging-wizard → debugging-wizard}/references/common-patterns.md +0 -0
- /package/skills/{jarvis/debugging-wizard → debugging-wizard}/references/debugging-tools.md +0 -0
- /package/skills/{jarvis/debugging-wizard → debugging-wizard}/references/quick-fixes.md +0 -0
- /package/skills/{jarvis/debugging-wizard → debugging-wizard}/references/strategies.md +0 -0
- /package/skills/{jarvis/debugging-wizard → debugging-wizard}/references/systematic-debugging.md +0 -0
- /package/skills/{ella/commands → design-commands}/design.md +0 -0
- /package/skills/{ella/commands → design-commands}/handoff.md +0 -0
- /package/skills/{ella/commands → design-commands}/prototype.md +0 -0
- /package/skills/{ella/commands → design-commands}/spec.md +0 -0
- /package/skills/{ella/commands → design-commands}/style.md +0 -0
- /package/skills/{jarvis/devops-engineer → devops-engineer}/SKILL.md +0 -0
- /package/skills/{jarvis/devops-engineer → devops-engineer}/references/deployment-strategies.md +0 -0
- /package/skills/{jarvis/devops-engineer → devops-engineer}/references/docker-patterns.md +0 -0
- /package/skills/{jarvis/devops-engineer → devops-engineer}/references/github-actions.md +0 -0
- /package/skills/{jarvis/devops-engineer → devops-engineer}/references/incident-response.md +0 -0
- /package/skills/{jarvis/devops-engineer → devops-engineer}/references/kubernetes.md +0 -0
- /package/skills/{jarvis/devops-engineer → devops-engineer}/references/platform-engineering.md +0 -0
- /package/skills/{jarvis/devops-engineer → devops-engineer}/references/release-automation.md +0 -0
- /package/skills/{jarvis/devops-engineer → devops-engineer}/references/terraform-iac.md +0 -0
- /package/skills/{jarvis/django-expert → django-expert}/SKILL.md +0 -0
- /package/skills/{jarvis/django-expert → django-expert}/references/authentication.md +0 -0
- /package/skills/{jarvis/django-expert → django-expert}/references/drf-serializers.md +0 -0
- /package/skills/{jarvis/django-expert → django-expert}/references/models-orm.md +0 -0
- /package/skills/{jarvis/django-expert → django-expert}/references/testing-django.md +0 -0
- /package/skills/{jarvis/django-expert → django-expert}/references/viewsets-views.md +0 -0
- /package/skills/{jarvis/dotnet-core-expert → dotnet-core-expert}/SKILL.md +0 -0
- /package/skills/{jarvis/dotnet-core-expert → dotnet-core-expert}/references/authentication.md +0 -0
- /package/skills/{jarvis/dotnet-core-expert → dotnet-core-expert}/references/clean-architecture.md +0 -0
- /package/skills/{jarvis/dotnet-core-expert → dotnet-core-expert}/references/cloud-native.md +0 -0
- /package/skills/{jarvis/dotnet-core-expert → dotnet-core-expert}/references/entity-framework.md +0 -0
- /package/skills/{jarvis/dotnet-core-expert → dotnet-core-expert}/references/minimal-apis.md +0 -0
- /package/skills/{jarvis/fastapi-expert → fastapi-expert}/SKILL.md +0 -0
- /package/skills/{jarvis/fastapi-expert → fastapi-expert}/references/async-sqlalchemy.md +0 -0
- /package/skills/{jarvis/fastapi-expert → fastapi-expert}/references/authentication.md +0 -0
- /package/skills/{jarvis/fastapi-expert → fastapi-expert}/references/endpoints-routing.md +0 -0
- /package/skills/{jarvis/fastapi-expert → fastapi-expert}/references/migration-from-django.md +0 -0
- /package/skills/{jarvis/fastapi-expert → fastapi-expert}/references/pydantic-v2.md +0 -0
- /package/skills/{jarvis/fastapi-expert → fastapi-expert}/references/testing-async.md +0 -0
- /package/skills/{jarvis/feature-forge → feature-forge}/SKILL.md +0 -0
- /package/skills/{jarvis/feature-forge → feature-forge}/references/acceptance-criteria.md +0 -0
- /package/skills/{jarvis/feature-forge → feature-forge}/references/ears-syntax.md +0 -0
- /package/skills/{jarvis/feature-forge → feature-forge}/references/interview-questions.md +0 -0
- /package/skills/{jarvis/feature-forge → feature-forge}/references/pre-discovery-subagents.md +0 -0
- /package/skills/{jarvis/feature-forge → feature-forge}/references/specification-template.md +0 -0
- /package/skills/{jarvis/fine-tuning-expert → fine-tuning-expert}/SKILL.md +0 -0
- /package/skills/{jarvis/fine-tuning-expert → fine-tuning-expert}/references/dataset-preparation.md +0 -0
- /package/skills/{jarvis/fine-tuning-expert → fine-tuning-expert}/references/deployment-optimization.md +0 -0
- /package/skills/{jarvis/fine-tuning-expert → fine-tuning-expert}/references/evaluation-metrics.md +0 -0
- /package/skills/{jarvis/fine-tuning-expert → fine-tuning-expert}/references/hyperparameter-tuning.md +0 -0
- /package/skills/{jarvis/fine-tuning-expert → fine-tuning-expert}/references/lora-peft.md +0 -0
- /package/skills/{max/workflow/finishing-a-development-branch → finishing-a-development-branch}/SKILL.md +0 -0
- /package/skills/{ella/flutter-expert → flutter-expert}/SKILL.md +0 -0
- /package/skills/{ella/flutter-expert → flutter-expert}/references/bloc-state.md +0 -0
- /package/skills/{ella/flutter-expert → flutter-expert}/references/gorouter-navigation.md +0 -0
- /package/skills/{ella/flutter-expert → flutter-expert}/references/performance.md +0 -0
- /package/skills/{ella/flutter-expert → flutter-expert}/references/project-structure.md +0 -0
- /package/skills/{ella/flutter-expert → flutter-expert}/references/riverpod-state.md +0 -0
- /package/skills/{ella/flutter-expert → flutter-expert}/references/widget-patterns.md +0 -0
- /package/skills/{jarvis/fullstack-guardian → fullstack-guardian}/SKILL.md +0 -0
- /package/skills/{jarvis/fullstack-guardian → fullstack-guardian}/references/api-design-standards.md +0 -0
- /package/skills/{jarvis/fullstack-guardian → fullstack-guardian}/references/architecture-decisions.md +0 -0
- /package/skills/{jarvis/fullstack-guardian → fullstack-guardian}/references/backend-patterns.md +0 -0
- /package/skills/{jarvis/fullstack-guardian → fullstack-guardian}/references/common-patterns.md +0 -0
- /package/skills/{jarvis/fullstack-guardian → fullstack-guardian}/references/deliverables-checklist.md +0 -0
- /package/skills/{jarvis/fullstack-guardian → fullstack-guardian}/references/design-template.md +0 -0
- /package/skills/{jarvis/fullstack-guardian → fullstack-guardian}/references/error-handling.md +0 -0
- /package/skills/{jarvis/fullstack-guardian → fullstack-guardian}/references/frontend-patterns.md +0 -0
- /package/skills/{jarvis/fullstack-guardian → fullstack-guardian}/references/integration-patterns.md +0 -0
- /package/skills/{jarvis/fullstack-guardian → fullstack-guardian}/references/security-checklist.md +0 -0
- /package/skills/{jarvis/golang-pro → golang-pro}/SKILL.md +0 -0
- /package/skills/{jarvis/golang-pro → golang-pro}/references/concurrency.md +0 -0
- /package/skills/{jarvis/golang-pro → golang-pro}/references/generics.md +0 -0
- /package/skills/{jarvis/golang-pro → golang-pro}/references/interfaces.md +0 -0
- /package/skills/{jarvis/golang-pro → golang-pro}/references/project-structure.md +0 -0
- /package/skills/{jarvis/golang-pro → golang-pro}/references/testing.md +0 -0
- /package/skills/{jarvis/graphql-architect → graphql-architect}/SKILL.md +0 -0
- /package/skills/{jarvis/graphql-architect → graphql-architect}/references/federation.md +0 -0
- /package/skills/{jarvis/graphql-architect → graphql-architect}/references/migration-from-rest.md +0 -0
- /package/skills/{jarvis/graphql-architect → graphql-architect}/references/resolvers.md +0 -0
- /package/skills/{jarvis/graphql-architect → graphql-architect}/references/schema-design.md +0 -0
- /package/skills/{jarvis/graphql-architect → graphql-architect}/references/security.md +0 -0
- /package/skills/{jarvis/graphql-architect → graphql-architect}/references/subscriptions.md +0 -0
- /package/skills/{jarvis/java-architect → java-architect}/SKILL.md +0 -0
- /package/skills/{jarvis/java-architect → java-architect}/references/jpa-optimization.md +0 -0
- /package/skills/{jarvis/java-architect → java-architect}/references/reactive-webflux.md +0 -0
- /package/skills/{jarvis/java-architect → java-architect}/references/spring-boot-setup.md +0 -0
- /package/skills/{jarvis/java-architect → java-architect}/references/spring-security.md +0 -0
- /package/skills/{jarvis/java-architect → java-architect}/references/testing-patterns.md +0 -0
- /package/skills/{jarvis/javascript-pro → javascript-pro}/SKILL.md +0 -0
- /package/skills/{jarvis/javascript-pro → javascript-pro}/references/async-patterns.md +0 -0
- /package/skills/{jarvis/javascript-pro → javascript-pro}/references/browser-apis.md +0 -0
- /package/skills/{jarvis/javascript-pro → javascript-pro}/references/modern-syntax.md +0 -0
- /package/skills/{jarvis/javascript-pro → javascript-pro}/references/modules.md +0 -0
- /package/skills/{jarvis/javascript-pro → javascript-pro}/references/node-essentials.md +0 -0
- /package/skills/{jarvis/kotlin-specialist → kotlin-specialist}/SKILL.md +0 -0
- /package/skills/{jarvis/kotlin-specialist → kotlin-specialist}/references/android-compose.md +0 -0
- /package/skills/{jarvis/kotlin-specialist → kotlin-specialist}/references/coroutines-flow.md +0 -0
- /package/skills/{jarvis/kotlin-specialist → kotlin-specialist}/references/dsl-idioms.md +0 -0
- /package/skills/{jarvis/kotlin-specialist → kotlin-specialist}/references/ktor-server.md +0 -0
- /package/skills/{jarvis/kotlin-specialist → kotlin-specialist}/references/multiplatform-kmp.md +0 -0
- /package/skills/{jarvis/kubernetes-specialist → kubernetes-specialist}/SKILL.md +0 -0
- /package/skills/{jarvis/kubernetes-specialist → kubernetes-specialist}/references/configuration.md +0 -0
- /package/skills/{jarvis/kubernetes-specialist → kubernetes-specialist}/references/cost-optimization.md +0 -0
- /package/skills/{jarvis/kubernetes-specialist → kubernetes-specialist}/references/custom-operators.md +0 -0
- /package/skills/{jarvis/kubernetes-specialist → kubernetes-specialist}/references/gitops.md +0 -0
- /package/skills/{jarvis/kubernetes-specialist → kubernetes-specialist}/references/helm-charts.md +0 -0
- /package/skills/{jarvis/kubernetes-specialist → kubernetes-specialist}/references/multi-cluster.md +0 -0
- /package/skills/{jarvis/kubernetes-specialist → kubernetes-specialist}/references/networking.md +0 -0
- /package/skills/{jarvis/kubernetes-specialist → kubernetes-specialist}/references/service-mesh.md +0 -0
- /package/skills/{jarvis/kubernetes-specialist → kubernetes-specialist}/references/storage.md +0 -0
- /package/skills/{jarvis/kubernetes-specialist → kubernetes-specialist}/references/troubleshooting.md +0 -0
- /package/skills/{jarvis/kubernetes-specialist → kubernetes-specialist}/references/workloads.md +0 -0
- /package/skills/{jarvis/laravel-specialist → laravel-specialist}/SKILL.md +0 -0
- /package/skills/{jarvis/laravel-specialist → laravel-specialist}/references/eloquent.md +0 -0
- /package/skills/{jarvis/laravel-specialist → laravel-specialist}/references/livewire.md +0 -0
- /package/skills/{jarvis/laravel-specialist → laravel-specialist}/references/queues.md +0 -0
- /package/skills/{jarvis/laravel-specialist → laravel-specialist}/references/routing.md +0 -0
- /package/skills/{jarvis/laravel-specialist → laravel-specialist}/references/testing.md +0 -0
- /package/skills/{jarvis/legacy-modernizer → legacy-modernizer}/SKILL.md +0 -0
- /package/skills/{jarvis/legacy-modernizer → legacy-modernizer}/references/legacy-testing.md +0 -0
- /package/skills/{jarvis/legacy-modernizer → legacy-modernizer}/references/migration-strategies.md +0 -0
- /package/skills/{jarvis/legacy-modernizer → legacy-modernizer}/references/refactoring-patterns.md +0 -0
- /package/skills/{jarvis/legacy-modernizer → legacy-modernizer}/references/strangler-fig-pattern.md +0 -0
- /package/skills/{jarvis/legacy-modernizer → legacy-modernizer}/references/system-assessment.md +0 -0
- /package/skills/{jarvis/mcp-developer → mcp-developer}/SKILL.md +0 -0
- /package/skills/{jarvis/mcp-developer → mcp-developer}/references/protocol.md +0 -0
- /package/skills/{jarvis/mcp-developer → mcp-developer}/references/python-sdk.md +0 -0
- /package/skills/{jarvis/mcp-developer → mcp-developer}/references/resources.md +0 -0
- /package/skills/{jarvis/mcp-developer → mcp-developer}/references/tools.md +0 -0
- /package/skills/{jarvis/mcp-developer → mcp-developer}/references/typescript-sdk.md +0 -0
- /package/skills/{max/meeting-notes → meeting-notes}/SKILL.md +0 -0
- /package/skills/{jarvis/microservices-architect → microservices-architect}/SKILL.md +0 -0
- /package/skills/{jarvis/microservices-architect → microservices-architect}/references/communication.md +0 -0
- /package/skills/{jarvis/microservices-architect → microservices-architect}/references/data.md +0 -0
- /package/skills/{jarvis/microservices-architect → microservices-architect}/references/decomposition.md +0 -0
- /package/skills/{jarvis/microservices-architect → microservices-architect}/references/observability.md +0 -0
- /package/skills/{jarvis/microservices-architect → microservices-architect}/references/patterns.md +0 -0
- /package/skills/{jarvis/ml-pipeline → ml-pipeline}/SKILL.md +0 -0
- /package/skills/{jarvis/ml-pipeline → ml-pipeline}/references/experiment-tracking.md +0 -0
- /package/skills/{jarvis/ml-pipeline → ml-pipeline}/references/feature-engineering.md +0 -0
- /package/skills/{jarvis/ml-pipeline → ml-pipeline}/references/model-validation.md +0 -0
- /package/skills/{jarvis/ml-pipeline → ml-pipeline}/references/pipeline-orchestration.md +0 -0
- /package/skills/{jarvis/ml-pipeline → ml-pipeline}/references/training-pipelines.md +0 -0
- /package/skills/{jarvis/monitoring-expert → monitoring-expert}/SKILL.md +0 -0
- /package/skills/{jarvis/monitoring-expert → monitoring-expert}/references/alerting-rules.md +0 -0
- /package/skills/{jarvis/monitoring-expert → monitoring-expert}/references/application-profiling.md +0 -0
- /package/skills/{jarvis/monitoring-expert → monitoring-expert}/references/capacity-planning.md +0 -0
- /package/skills/{jarvis/monitoring-expert → monitoring-expert}/references/dashboards.md +0 -0
- /package/skills/{jarvis/monitoring-expert → monitoring-expert}/references/opentelemetry.md +0 -0
- /package/skills/{jarvis/monitoring-expert → monitoring-expert}/references/performance-testing.md +0 -0
- /package/skills/{jarvis/monitoring-expert → monitoring-expert}/references/prometheus-metrics.md +0 -0
- /package/skills/{jarvis/monitoring-expert → monitoring-expert}/references/structured-logging.md +0 -0
- /package/skills/{jarvis/nestjs-expert → nestjs-expert}/SKILL.md +0 -0
- /package/skills/{jarvis/nestjs-expert → nestjs-expert}/references/authentication.md +0 -0
- /package/skills/{jarvis/nestjs-expert → nestjs-expert}/references/controllers-routing.md +0 -0
- /package/skills/{jarvis/nestjs-expert → nestjs-expert}/references/dtos-validation.md +0 -0
- /package/skills/{jarvis/nestjs-expert → nestjs-expert}/references/migration-from-express.md +0 -0
- /package/skills/{jarvis/nestjs-expert → nestjs-expert}/references/services-di.md +0 -0
- /package/skills/{jarvis/nestjs-expert → nestjs-expert}/references/testing-patterns.md +0 -0
- /package/skills/{ella/nextjs-developer → nextjs-developer}/SKILL.md +0 -0
- /package/skills/{ella/nextjs-developer → nextjs-developer}/references/app-router.md +0 -0
- /package/skills/{ella/nextjs-developer → nextjs-developer}/references/data-fetching.md +0 -0
- /package/skills/{ella/nextjs-developer → nextjs-developer}/references/deployment.md +0 -0
- /package/skills/{ella/nextjs-developer → nextjs-developer}/references/server-actions.md +0 -0
- /package/skills/{ella/nextjs-developer → nextjs-developer}/references/server-components.md +0 -0
- /package/skills/{jarvis/pandas-pro → pandas-pro}/SKILL.md +0 -0
- /package/skills/{jarvis/pandas-pro → pandas-pro}/references/aggregation-groupby.md +0 -0
- /package/skills/{jarvis/pandas-pro → pandas-pro}/references/data-cleaning.md +0 -0
- /package/skills/{jarvis/pandas-pro → pandas-pro}/references/dataframe-operations.md +0 -0
- /package/skills/{jarvis/pandas-pro → pandas-pro}/references/merging-joining.md +0 -0
- /package/skills/{jarvis/pandas-pro → pandas-pro}/references/performance-optimization.md +0 -0
- /package/skills/{jarvis/php-pro → php-pro}/SKILL.md +0 -0
- /package/skills/{jarvis/php-pro → php-pro}/references/async-patterns.md +0 -0
- /package/skills/{jarvis/php-pro → php-pro}/references/laravel-patterns.md +0 -0
- /package/skills/{jarvis/php-pro → php-pro}/references/modern-php-features.md +0 -0
- /package/skills/{jarvis/php-pro → php-pro}/references/symfony-patterns.md +0 -0
- /package/skills/{jarvis/php-pro → php-pro}/references/testing-quality.md +0 -0
- /package/skills/{kyle/playwright-expert → playwright-expert}/SKILL.md +0 -0
- /package/skills/{kyle/playwright-expert → playwright-expert}/references/api-mocking.md +0 -0
- /package/skills/{kyle/playwright-expert → playwright-expert}/references/configuration.md +0 -0
- /package/skills/{kyle/playwright-expert → playwright-expert}/references/debugging-flaky.md +0 -0
- /package/skills/{kyle/playwright-expert → playwright-expert}/references/page-object-model.md +0 -0
- /package/skills/{kyle/playwright-expert → playwright-expert}/references/selectors-locators.md +0 -0
- /package/skills/{jarvis/postgres-pro → postgres-pro}/SKILL.md +0 -0
- /package/skills/{jarvis/postgres-pro → postgres-pro}/references/extensions.md +0 -0
- /package/skills/{jarvis/postgres-pro → postgres-pro}/references/jsonb.md +0 -0
- /package/skills/{jarvis/postgres-pro → postgres-pro}/references/maintenance.md +0 -0
- /package/skills/{jarvis/postgres-pro → postgres-pro}/references/performance.md +0 -0
- /package/skills/{jarvis/postgres-pro → postgres-pro}/references/replication.md +0 -0
- /package/skills/{max/prd-template → prd-template}/SKILL.md +0 -0
- /package/skills/{jarvis/python-pro → python-pro}/SKILL.md +0 -0
- /package/skills/{jarvis/python-pro → python-pro}/references/async-patterns.md +0 -0
- /package/skills/{jarvis/python-pro → python-pro}/references/packaging.md +0 -0
- /package/skills/{jarvis/python-pro → python-pro}/references/standard-library.md +0 -0
- /package/skills/{jarvis/python-pro → python-pro}/references/testing.md +0 -0
- /package/skills/{jarvis/python-pro → python-pro}/references/type-system.md +0 -0
- /package/skills/{jarvis/rag-architect → rag-architect}/SKILL.md +0 -0
- /package/skills/{jarvis/rag-architect → rag-architect}/references/chunking-strategies.md +0 -0
- /package/skills/{jarvis/rag-architect → rag-architect}/references/embedding-models.md +0 -0
- /package/skills/{jarvis/rag-architect → rag-architect}/references/rag-evaluation.md +0 -0
- /package/skills/{jarvis/rag-architect → rag-architect}/references/retrieval-optimization.md +0 -0
- /package/skills/{jarvis/rag-architect → rag-architect}/references/vector-databases.md +0 -0
- /package/skills/{jarvis/rails-expert → rails-expert}/SKILL.md +0 -0
- /package/skills/{jarvis/rails-expert → rails-expert}/references/active-record.md +0 -0
- /package/skills/{jarvis/rails-expert → rails-expert}/references/api-development.md +0 -0
- /package/skills/{jarvis/rails-expert → rails-expert}/references/background-jobs.md +0 -0
- /package/skills/{jarvis/rails-expert → rails-expert}/references/hotwire-turbo.md +0 -0
- /package/skills/{jarvis/rails-expert → rails-expert}/references/rspec-testing.md +0 -0
- /package/skills/{ella/react-expert → react-expert}/SKILL.md +0 -0
- /package/skills/{ella/react-expert → react-expert}/references/hooks-patterns.md +0 -0
- /package/skills/{ella/react-expert → react-expert}/references/migration-class-to-modern.md +0 -0
- /package/skills/{ella/react-expert → react-expert}/references/performance.md +0 -0
- /package/skills/{ella/react-expert → react-expert}/references/react-19-features.md +0 -0
- /package/skills/{ella/react-expert → react-expert}/references/server-components.md +0 -0
- /package/skills/{ella/react-expert → react-expert}/references/state-management.md +0 -0
- /package/skills/{ella/react-expert → react-expert}/references/testing-react.md +0 -0
- /package/skills/{ella/react-native-expert → react-native-expert}/SKILL.md +0 -0
- /package/skills/{ella/react-native-expert → react-native-expert}/references/expo-router.md +0 -0
- /package/skills/{ella/react-native-expert → react-native-expert}/references/list-optimization.md +0 -0
- /package/skills/{ella/react-native-expert → react-native-expert}/references/platform-handling.md +0 -0
- /package/skills/{ella/react-native-expert → react-native-expert}/references/project-structure.md +0 -0
- /package/skills/{ella/react-native-expert → react-native-expert}/references/storage-hooks.md +0 -0
- /package/skills/{jarvis/rust-engineer → rust-engineer}/SKILL.md +0 -0
- /package/skills/{jarvis/rust-engineer → rust-engineer}/references/async.md +0 -0
- /package/skills/{jarvis/rust-engineer → rust-engineer}/references/error-handling.md +0 -0
- /package/skills/{jarvis/rust-engineer → rust-engineer}/references/ownership.md +0 -0
- /package/skills/{jarvis/rust-engineer → rust-engineer}/references/testing.md +0 -0
- /package/skills/{jarvis/rust-engineer → rust-engineer}/references/traits.md +0 -0
- /package/skills/{jarvis/secure-code-guardian → secure-code-guardian}/SKILL.md +0 -0
- /package/skills/{jarvis/secure-code-guardian → secure-code-guardian}/references/authentication.md +0 -0
- /package/skills/{jarvis/secure-code-guardian → secure-code-guardian}/references/input-validation.md +0 -0
- /package/skills/{jarvis/secure-code-guardian → secure-code-guardian}/references/owasp-prevention.md +0 -0
- /package/skills/{jarvis/secure-code-guardian → secure-code-guardian}/references/security-headers.md +0 -0
- /package/skills/{jarvis/secure-code-guardian → secure-code-guardian}/references/xss-csrf.md +0 -0
- /package/skills/{kyle/security-reviewer → security-reviewer}/SKILL.md +0 -0
- /package/skills/{kyle/security-reviewer → security-reviewer}/references/infrastructure-security.md +0 -0
- /package/skills/{kyle/security-reviewer → security-reviewer}/references/penetration-testing.md +0 -0
- /package/skills/{kyle/security-reviewer → security-reviewer}/references/report-template.md +0 -0
- /package/skills/{kyle/security-reviewer → security-reviewer}/references/sast-tools.md +0 -0
- /package/skills/{kyle/security-reviewer → security-reviewer}/references/secret-scanning.md +0 -0
- /package/skills/{kyle/security-reviewer → security-reviewer}/references/vulnerability-patterns.md +0 -0
- /package/skills/{ella/senior-frontend → senior-frontend}/SKILL.md +0 -0
- /package/skills/{ella/senior-frontend → senior-frontend}/references/frontend_best_practices.md +0 -0
- /package/skills/{ella/senior-frontend → senior-frontend}/references/nextjs_optimization_guide.md +0 -0
- /package/skills/{ella/senior-frontend → senior-frontend}/references/react_patterns.md +0 -0
- /package/skills/{ella/senior-frontend → senior-frontend}/scripts/bundle_analyzer.py +0 -0
- /package/skills/{ella/senior-frontend → senior-frontend}/scripts/component_generator.py +0 -0
- /package/skills/{ella/senior-frontend → senior-frontend}/scripts/frontend_scaffolder.py +0 -0
- /package/skills/{kyle/senior-qa → senior-qa}/README.md +0 -0
- /package/skills/{kyle/senior-qa → senior-qa}/SKILL.md +0 -0
- /package/skills/{kyle/senior-qa → senior-qa}/references/qa_best_practices.md +0 -0
- /package/skills/{kyle/senior-qa → senior-qa}/references/test_automation_patterns.md +0 -0
- /package/skills/{kyle/senior-qa → senior-qa}/references/testing_strategies.md +0 -0
- /package/skills/{kyle/senior-qa → senior-qa}/scripts/coverage_analyzer.py +0 -0
- /package/skills/{kyle/senior-qa → senior-qa}/scripts/e2e_test_scaffolder.py +0 -0
- /package/skills/{kyle/senior-qa → senior-qa}/scripts/test_suite_generator.py +0 -0
- /package/skills/{jarvis/spark-engineer → spark-engineer}/SKILL.md +0 -0
- /package/skills/{jarvis/spark-engineer → spark-engineer}/references/partitioning-caching.md +0 -0
- /package/skills/{jarvis/spark-engineer → spark-engineer}/references/performance-tuning.md +0 -0
- /package/skills/{jarvis/spark-engineer → spark-engineer}/references/rdd-operations.md +0 -0
- /package/skills/{jarvis/spark-engineer → spark-engineer}/references/spark-sql-dataframes.md +0 -0
- /package/skills/{jarvis/spark-engineer → spark-engineer}/references/streaming-patterns.md +0 -0
- /package/skills/{jarvis/spring-boot-engineer → spring-boot-engineer}/SKILL.md +0 -0
- /package/skills/{jarvis/spring-boot-engineer → spring-boot-engineer}/references/cloud.md +0 -0
- /package/skills/{jarvis/spring-boot-engineer → spring-boot-engineer}/references/data.md +0 -0
- /package/skills/{jarvis/spring-boot-engineer → spring-boot-engineer}/references/security.md +0 -0
- /package/skills/{jarvis/spring-boot-engineer → spring-boot-engineer}/references/testing.md +0 -0
- /package/skills/{jarvis/spring-boot-engineer → spring-boot-engineer}/references/web.md +0 -0
- /package/skills/{jarvis/sql-pro → sql-pro}/SKILL.md +0 -0
- /package/skills/{jarvis/sql-pro → sql-pro}/references/database-design.md +0 -0
- /package/skills/{jarvis/sql-pro → sql-pro}/references/dialect-differences.md +0 -0
- /package/skills/{jarvis/sql-pro → sql-pro}/references/optimization.md +0 -0
- /package/skills/{jarvis/sql-pro → sql-pro}/references/query-patterns.md +0 -0
- /package/skills/{jarvis/sql-pro → sql-pro}/references/window-functions.md +0 -0
- /package/skills/{jarvis/sre-engineer → sre-engineer}/SKILL.md +0 -0
- /package/skills/{jarvis/sre-engineer → sre-engineer}/references/automation-toil.md +0 -0
- /package/skills/{jarvis/sre-engineer → sre-engineer}/references/error-budget-policy.md +0 -0
- /package/skills/{jarvis/sre-engineer → sre-engineer}/references/incident-chaos.md +0 -0
- /package/skills/{jarvis/sre-engineer → sre-engineer}/references/monitoring-alerting.md +0 -0
- /package/skills/{jarvis/sre-engineer → sre-engineer}/references/slo-sli-management.md +0 -0
- /package/skills/{max/stakeholder-update → stakeholder-update}/SKILL.md +0 -0
- /package/skills/{jarvis/swift-expert → swift-expert}/SKILL.md +0 -0
- /package/skills/{jarvis/swift-expert → swift-expert}/references/async-concurrency.md +0 -0
- /package/skills/{jarvis/swift-expert → swift-expert}/references/memory-performance.md +0 -0
- /package/skills/{jarvis/swift-expert → swift-expert}/references/protocol-oriented.md +0 -0
- /package/skills/{jarvis/swift-expert → swift-expert}/references/swiftui-patterns.md +0 -0
- /package/skills/{jarvis/swift-expert → swift-expert}/references/testing-patterns.md +0 -0
- /package/skills/{max/workflow/systematic-debugging → systematic-debugging}/SKILL.md +0 -0
- /package/skills/{kyle/tdd-guide → tdd-guide}/HOW_TO_USE.md +0 -0
- /package/skills/{kyle/tdd-guide → tdd-guide}/README.md +0 -0
- /package/skills/{kyle/tdd-guide → tdd-guide}/SKILL.md +0 -0
- /package/skills/{kyle/tdd-guide → tdd-guide}/assets/expected_output.json +0 -0
- /package/skills/{kyle/tdd-guide → tdd-guide}/assets/sample_coverage_report.lcov +0 -0
- /package/skills/{kyle/tdd-guide → tdd-guide}/assets/sample_input_python.json +0 -0
- /package/skills/{kyle/tdd-guide → tdd-guide}/assets/sample_input_typescript.json +0 -0
- /package/skills/{kyle/tdd-guide → tdd-guide}/references/ci-integration.md +0 -0
- /package/skills/{kyle/tdd-guide → tdd-guide}/references/framework-guide.md +0 -0
- /package/skills/{kyle/tdd-guide → tdd-guide}/references/tdd-best-practices.md +0 -0
- /package/skills/{kyle/tdd-guide → tdd-guide}/scripts/coverage_analyzer.py +0 -0
- /package/skills/{kyle/tdd-guide → tdd-guide}/scripts/fixture_generator.py +0 -0
- /package/skills/{kyle/tdd-guide → tdd-guide}/scripts/format_detector.py +0 -0
- /package/skills/{kyle/tdd-guide → tdd-guide}/scripts/framework_adapter.py +0 -0
- /package/skills/{kyle/tdd-guide → tdd-guide}/scripts/metrics_calculator.py +0 -0
- /package/skills/{kyle/tdd-guide → tdd-guide}/scripts/output_formatter.py +0 -0
- /package/skills/{kyle/tdd-guide → tdd-guide}/scripts/tdd_workflow.py +0 -0
- /package/skills/{kyle/tdd-guide → tdd-guide}/scripts/test_generator.py +0 -0
- /package/skills/{jarvis/terraform-engineer → terraform-engineer}/SKILL.md +0 -0
- /package/skills/{jarvis/terraform-engineer → terraform-engineer}/references/best-practices.md +0 -0
- /package/skills/{jarvis/terraform-engineer → terraform-engineer}/references/module-patterns.md +0 -0
- /package/skills/{jarvis/terraform-engineer → terraform-engineer}/references/providers.md +0 -0
- /package/skills/{jarvis/terraform-engineer → terraform-engineer}/references/state-management.md +0 -0
- /package/skills/{jarvis/terraform-engineer → terraform-engineer}/references/testing.md +0 -0
- /package/skills/{kyle/test-master → test-master}/SKILL.md +0 -0
- /package/skills/{kyle/test-master → test-master}/references/automation-frameworks.md +0 -0
- /package/skills/{kyle/test-master → test-master}/references/e2e-testing.md +0 -0
- /package/skills/{kyle/test-master → test-master}/references/integration-testing.md +0 -0
- /package/skills/{kyle/test-master → test-master}/references/performance-testing.md +0 -0
- /package/skills/{kyle/test-master → test-master}/references/qa-methodology.md +0 -0
- /package/skills/{kyle/test-master → test-master}/references/security-testing.md +0 -0
- /package/skills/{kyle/test-master → test-master}/references/tdd-iron-laws.md +0 -0
- /package/skills/{kyle/test-master → test-master}/references/test-reports.md +0 -0
- /package/skills/{kyle/test-master → test-master}/references/testing-anti-patterns.md +0 -0
- /package/skills/{kyle/test-master → test-master}/references/unit-testing.md +0 -0
- /package/skills/{jarvis/typescript-pro → typescript-pro}/SKILL.md +0 -0
- /package/skills/{jarvis/typescript-pro → typescript-pro}/references/advanced-types.md +0 -0
- /package/skills/{jarvis/typescript-pro → typescript-pro}/references/configuration.md +0 -0
- /package/skills/{jarvis/typescript-pro → typescript-pro}/references/patterns.md +0 -0
- /package/skills/{jarvis/typescript-pro → typescript-pro}/references/type-guards.md +0 -0
- /package/skills/{jarvis/typescript-pro → typescript-pro}/references/utility-types.md +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/SKILL.md +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/data/charts.csv +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/data/colors.csv +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/data/icons.csv +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/data/landing.csv +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/data/products.csv +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/data/react-performance.csv +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/data/stacks/astro.csv +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/data/stacks/flutter.csv +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/data/stacks/html-tailwind.csv +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/data/stacks/jetpack-compose.csv +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/data/stacks/nextjs.csv +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/data/stacks/nuxt-ui.csv +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/data/stacks/nuxtjs.csv +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/data/stacks/react-native.csv +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/data/stacks/react.csv +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/data/stacks/shadcn.csv +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/data/stacks/svelte.csv +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/data/stacks/swiftui.csv +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/data/stacks/vue.csv +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/data/styles.csv +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/data/typography.csv +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/data/ui-reasoning.csv +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/data/ux-guidelines.csv +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/data/web-interface.csv +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/scripts/__pycache__/core.cpython-39.pyc +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/scripts/__pycache__/design_system.cpython-39.pyc +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/scripts/core.py +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/scripts/design_system.py +0 -0
- /package/skills/{ella/ui-ux-pro-max → ui-ux-pro-max}/scripts/search.py +0 -0
- /package/skills/{max/user-research-synthesis → user-research-synthesis}/SKILL.md +0 -0
- /package/skills/{max/workflow/verification-before-completion → verification-before-completion}/SKILL.md +0 -0
- /package/skills/{ella/vue-expert → vue-expert}/SKILL.md +0 -0
- /package/skills/{ella/vue-expert → vue-expert}/references/build-tooling.md +0 -0
- /package/skills/{ella/vue-expert → vue-expert}/references/components.md +0 -0
- /package/skills/{ella/vue-expert → vue-expert}/references/composition-api.md +0 -0
- /package/skills/{ella/vue-expert → vue-expert}/references/mobile-hybrid.md +0 -0
- /package/skills/{ella/vue-expert → vue-expert}/references/nuxt.md +0 -0
- /package/skills/{ella/vue-expert → vue-expert}/references/state-management.md +0 -0
- /package/skills/{ella/vue-expert → vue-expert}/references/typescript.md +0 -0
- /package/skills/{ella/vue-expert-js → vue-expert-js}/SKILL.md +0 -0
- /package/skills/{ella/vue-expert-js → vue-expert-js}/references/component-architecture.md +0 -0
- /package/skills/{ella/vue-expert-js → vue-expert-js}/references/composables-patterns.md +0 -0
- /package/skills/{ella/vue-expert-js → vue-expert-js}/references/jsdoc-typing.md +0 -0
- /package/skills/{ella/vue-expert-js → vue-expert-js}/references/state-management.md +0 -0
- /package/skills/{ella/vue-expert-js → vue-expert-js}/references/testing-patterns.md +0 -0
- /package/skills/{jarvis/websocket-engineer → websocket-engineer}/SKILL.md +0 -0
- /package/skills/{jarvis/websocket-engineer → websocket-engineer}/references/alternatives.md +0 -0
- /package/skills/{jarvis/websocket-engineer → websocket-engineer}/references/patterns.md +0 -0
- /package/skills/{jarvis/websocket-engineer → websocket-engineer}/references/protocol.md +0 -0
- /package/skills/{jarvis/websocket-engineer → websocket-engineer}/references/scaling.md +0 -0
- /package/skills/{jarvis/websocket-engineer → websocket-engineer}/references/security.md +0 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.java"
|
|
4
|
+
---
|
|
5
|
+
# Java Patterns
|
|
6
|
+
|
|
7
|
+
> This file extends [common/patterns.md](../common/patterns.md) with Java-specific content.
|
|
8
|
+
|
|
9
|
+
## Repository Pattern
|
|
10
|
+
|
|
11
|
+
Encapsulate data access behind an interface:
|
|
12
|
+
|
|
13
|
+
```java
|
|
14
|
+
public interface OrderRepository {
|
|
15
|
+
Optional<Order> findById(Long id);
|
|
16
|
+
List<Order> findAll();
|
|
17
|
+
Order save(Order order);
|
|
18
|
+
void deleteById(Long id);
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Concrete implementations handle storage details (JPA, JDBC, in-memory for tests).
|
|
23
|
+
|
|
24
|
+
## Service Layer
|
|
25
|
+
|
|
26
|
+
Business logic in service classes; keep controllers and repositories thin:
|
|
27
|
+
|
|
28
|
+
```java
|
|
29
|
+
public class OrderService {
|
|
30
|
+
private final OrderRepository orderRepository;
|
|
31
|
+
private final PaymentGateway paymentGateway;
|
|
32
|
+
|
|
33
|
+
public OrderService(OrderRepository orderRepository, PaymentGateway paymentGateway) {
|
|
34
|
+
this.orderRepository = orderRepository;
|
|
35
|
+
this.paymentGateway = paymentGateway;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public OrderSummary placeOrder(CreateOrderRequest request) {
|
|
39
|
+
var order = Order.from(request);
|
|
40
|
+
paymentGateway.charge(order.total());
|
|
41
|
+
var saved = orderRepository.save(order);
|
|
42
|
+
return OrderSummary.from(saved);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Constructor Injection
|
|
48
|
+
|
|
49
|
+
Always use constructor injection — never field injection:
|
|
50
|
+
|
|
51
|
+
```java
|
|
52
|
+
// GOOD — constructor injection (testable, immutable)
|
|
53
|
+
public class NotificationService {
|
|
54
|
+
private final EmailSender emailSender;
|
|
55
|
+
|
|
56
|
+
public NotificationService(EmailSender emailSender) {
|
|
57
|
+
this.emailSender = emailSender;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// BAD — field injection (untestable without reflection, requires framework magic)
|
|
62
|
+
public class NotificationService {
|
|
63
|
+
@Inject // or @Autowired
|
|
64
|
+
private EmailSender emailSender;
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## DTO Mapping
|
|
69
|
+
|
|
70
|
+
Use records for DTOs. Map at service/controller boundaries:
|
|
71
|
+
|
|
72
|
+
```java
|
|
73
|
+
public record OrderResponse(Long id, String customer, BigDecimal total) {
|
|
74
|
+
public static OrderResponse from(Order order) {
|
|
75
|
+
return new OrderResponse(order.getId(), order.getCustomerName(), order.getTotal());
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Builder Pattern
|
|
81
|
+
|
|
82
|
+
Use for objects with many optional parameters:
|
|
83
|
+
|
|
84
|
+
```java
|
|
85
|
+
public class SearchCriteria {
|
|
86
|
+
private final String query;
|
|
87
|
+
private final int page;
|
|
88
|
+
private final int size;
|
|
89
|
+
private final String sortBy;
|
|
90
|
+
|
|
91
|
+
private SearchCriteria(Builder builder) {
|
|
92
|
+
this.query = builder.query;
|
|
93
|
+
this.page = builder.page;
|
|
94
|
+
this.size = builder.size;
|
|
95
|
+
this.sortBy = builder.sortBy;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
public static class Builder {
|
|
99
|
+
private String query = "";
|
|
100
|
+
private int page = 0;
|
|
101
|
+
private int size = 20;
|
|
102
|
+
private String sortBy = "id";
|
|
103
|
+
|
|
104
|
+
public Builder query(String query) { this.query = query; return this; }
|
|
105
|
+
public Builder page(int page) { this.page = page; return this; }
|
|
106
|
+
public Builder size(int size) { this.size = size; return this; }
|
|
107
|
+
public Builder sortBy(String sortBy) { this.sortBy = sortBy; return this; }
|
|
108
|
+
public SearchCriteria build() { return new SearchCriteria(this); }
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Sealed Types for Domain Models
|
|
114
|
+
|
|
115
|
+
```java
|
|
116
|
+
public sealed interface PaymentResult permits PaymentSuccess, PaymentFailure {
|
|
117
|
+
record PaymentSuccess(String transactionId, BigDecimal amount) implements PaymentResult {}
|
|
118
|
+
record PaymentFailure(String errorCode, String message) implements PaymentResult {}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Exhaustive handling (Java 21+)
|
|
122
|
+
String message = switch (result) {
|
|
123
|
+
case PaymentSuccess s -> "Paid: " + s.transactionId();
|
|
124
|
+
case PaymentFailure f -> "Failed: " + f.errorCode();
|
|
125
|
+
};
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## API Response Envelope
|
|
129
|
+
|
|
130
|
+
Consistent API responses:
|
|
131
|
+
|
|
132
|
+
```java
|
|
133
|
+
public record ApiResponse<T>(boolean success, T data, String error) {
|
|
134
|
+
public static <T> ApiResponse<T> ok(T data) {
|
|
135
|
+
return new ApiResponse<>(true, data, null);
|
|
136
|
+
}
|
|
137
|
+
public static <T> ApiResponse<T> error(String message) {
|
|
138
|
+
return new ApiResponse<>(false, null, message);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## References
|
|
144
|
+
|
|
145
|
+
See skill: `springboot-patterns` for Spring Boot architecture patterns.
|
|
146
|
+
See skill: `jpa-patterns` for entity design and query optimization.
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.java"
|
|
4
|
+
---
|
|
5
|
+
# Java Security
|
|
6
|
+
|
|
7
|
+
> This file extends [common/security.md](../common/security.md) with Java-specific content.
|
|
8
|
+
|
|
9
|
+
## Secrets Management
|
|
10
|
+
|
|
11
|
+
- Never hardcode API keys, tokens, or credentials in source code
|
|
12
|
+
- Use environment variables: `System.getenv("API_KEY")`
|
|
13
|
+
- Use a secret manager (Vault, AWS Secrets Manager) for production secrets
|
|
14
|
+
- Keep local config files with secrets in `.gitignore`
|
|
15
|
+
|
|
16
|
+
```java
|
|
17
|
+
// BAD
|
|
18
|
+
private static final String API_KEY = "sk-abc123...";
|
|
19
|
+
|
|
20
|
+
// GOOD — environment variable
|
|
21
|
+
String apiKey = System.getenv("PAYMENT_API_KEY");
|
|
22
|
+
Objects.requireNonNull(apiKey, "PAYMENT_API_KEY must be set");
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## SQL Injection Prevention
|
|
26
|
+
|
|
27
|
+
- Always use parameterized queries — never concatenate user input into SQL
|
|
28
|
+
- Use `PreparedStatement` or your framework's parameterized query API
|
|
29
|
+
- Validate and sanitize any input used in native queries
|
|
30
|
+
|
|
31
|
+
```java
|
|
32
|
+
// BAD — SQL injection via string concatenation
|
|
33
|
+
Statement stmt = conn.createStatement();
|
|
34
|
+
String sql = "SELECT * FROM orders WHERE name = '" + name + "'";
|
|
35
|
+
stmt.executeQuery(sql);
|
|
36
|
+
|
|
37
|
+
// GOOD — PreparedStatement with parameterized query
|
|
38
|
+
PreparedStatement ps = conn.prepareStatement("SELECT * FROM orders WHERE name = ?");
|
|
39
|
+
ps.setString(1, name);
|
|
40
|
+
|
|
41
|
+
// GOOD — JDBC template
|
|
42
|
+
jdbcTemplate.query("SELECT * FROM orders WHERE name = ?", mapper, name);
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Input Validation
|
|
46
|
+
|
|
47
|
+
- Validate all user input at system boundaries before processing
|
|
48
|
+
- Use Bean Validation (`@NotNull`, `@NotBlank`, `@Size`) on DTOs when using a validation framework
|
|
49
|
+
- Sanitize file paths and user-provided strings before use
|
|
50
|
+
- Reject input that fails validation with clear error messages
|
|
51
|
+
|
|
52
|
+
```java
|
|
53
|
+
// Validate manually in plain Java
|
|
54
|
+
public Order createOrder(String customerName, BigDecimal amount) {
|
|
55
|
+
if (customerName == null || customerName.isBlank()) {
|
|
56
|
+
throw new IllegalArgumentException("Customer name is required");
|
|
57
|
+
}
|
|
58
|
+
if (amount == null || amount.compareTo(BigDecimal.ZERO) <= 0) {
|
|
59
|
+
throw new IllegalArgumentException("Amount must be positive");
|
|
60
|
+
}
|
|
61
|
+
return new Order(customerName, amount);
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Authentication and Authorization
|
|
66
|
+
|
|
67
|
+
- Never implement custom auth crypto — use established libraries
|
|
68
|
+
- Store passwords with bcrypt or Argon2, never MD5/SHA1
|
|
69
|
+
- Enforce authorization checks at service boundaries
|
|
70
|
+
- Clear sensitive data from logs — never log passwords, tokens, or PII
|
|
71
|
+
|
|
72
|
+
## Dependency Security
|
|
73
|
+
|
|
74
|
+
- Run `mvn dependency:tree` or `./gradlew dependencies` to audit transitive dependencies
|
|
75
|
+
- Use OWASP Dependency-Check or Snyk to scan for known CVEs
|
|
76
|
+
- Keep dependencies updated — set up Dependabot or Renovate
|
|
77
|
+
|
|
78
|
+
## Error Messages
|
|
79
|
+
|
|
80
|
+
- Never expose stack traces, internal paths, or SQL errors in API responses
|
|
81
|
+
- Map exceptions to safe, generic client messages at handler boundaries
|
|
82
|
+
- Log detailed errors server-side; return generic messages to clients
|
|
83
|
+
|
|
84
|
+
```java
|
|
85
|
+
// Log the detail, return a generic message
|
|
86
|
+
try {
|
|
87
|
+
return orderService.findById(id);
|
|
88
|
+
} catch (OrderNotFoundException ex) {
|
|
89
|
+
log.warn("Order not found: id={}", id);
|
|
90
|
+
return ApiResponse.error("Resource not found"); // generic, no internals
|
|
91
|
+
} catch (Exception ex) {
|
|
92
|
+
log.error("Unexpected error processing order id={}", id, ex);
|
|
93
|
+
return ApiResponse.error("Internal server error"); // never expose ex.getMessage()
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## References
|
|
98
|
+
|
|
99
|
+
See skill: `springboot-security` for Spring Security authentication and authorization patterns.
|
|
100
|
+
See skill: `security-review` for general security checklists.
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.java"
|
|
4
|
+
---
|
|
5
|
+
# Java Testing
|
|
6
|
+
|
|
7
|
+
> This file extends [common/testing.md](../common/testing.md) with Java-specific content.
|
|
8
|
+
|
|
9
|
+
## Test Framework
|
|
10
|
+
|
|
11
|
+
- **JUnit 5** (`@Test`, `@ParameterizedTest`, `@Nested`, `@DisplayName`)
|
|
12
|
+
- **AssertJ** for fluent assertions (`assertThat(result).isEqualTo(expected)`)
|
|
13
|
+
- **Mockito** for mocking dependencies
|
|
14
|
+
- **Testcontainers** for integration tests requiring databases or services
|
|
15
|
+
|
|
16
|
+
## Test Organization
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
src/test/java/com/example/app/
|
|
20
|
+
service/ # Unit tests for service layer
|
|
21
|
+
controller/ # Web layer / API tests
|
|
22
|
+
repository/ # Data access tests
|
|
23
|
+
integration/ # Cross-layer integration tests
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Mirror the `src/main/java` package structure in `src/test/java`.
|
|
27
|
+
|
|
28
|
+
## Unit Test Pattern
|
|
29
|
+
|
|
30
|
+
```java
|
|
31
|
+
@ExtendWith(MockitoExtension.class)
|
|
32
|
+
class OrderServiceTest {
|
|
33
|
+
|
|
34
|
+
@Mock
|
|
35
|
+
private OrderRepository orderRepository;
|
|
36
|
+
|
|
37
|
+
private OrderService orderService;
|
|
38
|
+
|
|
39
|
+
@BeforeEach
|
|
40
|
+
void setUp() {
|
|
41
|
+
orderService = new OrderService(orderRepository);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
@Test
|
|
45
|
+
@DisplayName("findById returns order when exists")
|
|
46
|
+
void findById_existingOrder_returnsOrder() {
|
|
47
|
+
var order = new Order(1L, "Alice", BigDecimal.TEN);
|
|
48
|
+
when(orderRepository.findById(1L)).thenReturn(Optional.of(order));
|
|
49
|
+
|
|
50
|
+
var result = orderService.findById(1L);
|
|
51
|
+
|
|
52
|
+
assertThat(result.customerName()).isEqualTo("Alice");
|
|
53
|
+
verify(orderRepository).findById(1L);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
@Test
|
|
57
|
+
@DisplayName("findById throws when order not found")
|
|
58
|
+
void findById_missingOrder_throws() {
|
|
59
|
+
when(orderRepository.findById(99L)).thenReturn(Optional.empty());
|
|
60
|
+
|
|
61
|
+
assertThatThrownBy(() -> orderService.findById(99L))
|
|
62
|
+
.isInstanceOf(OrderNotFoundException.class)
|
|
63
|
+
.hasMessageContaining("99");
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Parameterized Tests
|
|
69
|
+
|
|
70
|
+
```java
|
|
71
|
+
@ParameterizedTest
|
|
72
|
+
@CsvSource({
|
|
73
|
+
"100.00, 10, 90.00",
|
|
74
|
+
"50.00, 0, 50.00",
|
|
75
|
+
"200.00, 25, 150.00"
|
|
76
|
+
})
|
|
77
|
+
@DisplayName("discount applied correctly")
|
|
78
|
+
void applyDiscount(BigDecimal price, int pct, BigDecimal expected) {
|
|
79
|
+
assertThat(PricingUtils.discount(price, pct)).isEqualByComparingTo(expected);
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Integration Tests
|
|
84
|
+
|
|
85
|
+
Use Testcontainers for real database integration:
|
|
86
|
+
|
|
87
|
+
```java
|
|
88
|
+
@Testcontainers
|
|
89
|
+
class OrderRepositoryIT {
|
|
90
|
+
|
|
91
|
+
@Container
|
|
92
|
+
static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:16");
|
|
93
|
+
|
|
94
|
+
private OrderRepository repository;
|
|
95
|
+
|
|
96
|
+
@BeforeEach
|
|
97
|
+
void setUp() {
|
|
98
|
+
var dataSource = new PGSimpleDataSource();
|
|
99
|
+
dataSource.setUrl(postgres.getJdbcUrl());
|
|
100
|
+
dataSource.setUser(postgres.getUsername());
|
|
101
|
+
dataSource.setPassword(postgres.getPassword());
|
|
102
|
+
repository = new JdbcOrderRepository(dataSource);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
@Test
|
|
106
|
+
void save_and_findById() {
|
|
107
|
+
var saved = repository.save(new Order(null, "Bob", BigDecimal.ONE));
|
|
108
|
+
var found = repository.findById(saved.getId());
|
|
109
|
+
assertThat(found).isPresent();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
For Spring Boot integration tests, see skill: `springboot-tdd`.
|
|
115
|
+
|
|
116
|
+
## Test Naming
|
|
117
|
+
|
|
118
|
+
Use descriptive names with `@DisplayName`:
|
|
119
|
+
- `methodName_scenario_expectedBehavior()` for method names
|
|
120
|
+
- `@DisplayName("human-readable description")` for reports
|
|
121
|
+
|
|
122
|
+
## Coverage
|
|
123
|
+
|
|
124
|
+
- Target 80%+ line coverage
|
|
125
|
+
- Use JaCoCo for coverage reporting
|
|
126
|
+
- Focus on service and domain logic — skip trivial getters/config classes
|
|
127
|
+
|
|
128
|
+
## References
|
|
129
|
+
|
|
130
|
+
See skill: `springboot-tdd` for Spring Boot TDD patterns with MockMvc and Testcontainers.
|
|
131
|
+
See skill: `java-coding-standards` for testing expectations.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.kt"
|
|
4
|
+
- "**/*.kts"
|
|
5
|
+
---
|
|
6
|
+
# Kotlin Coding Style
|
|
7
|
+
|
|
8
|
+
> This file extends [common/coding-style.md](../common/coding-style.md) with Kotlin-specific content.
|
|
9
|
+
|
|
10
|
+
## Formatting
|
|
11
|
+
|
|
12
|
+
- **ktlint** or **Detekt** for style enforcement
|
|
13
|
+
- Official Kotlin code style (`kotlin.code.style=official` in `gradle.properties`)
|
|
14
|
+
|
|
15
|
+
## Immutability
|
|
16
|
+
|
|
17
|
+
- Prefer `val` over `var` — default to `val` and only use `var` when mutation is required
|
|
18
|
+
- Use `data class` for value types; use immutable collections (`List`, `Map`, `Set`) in public APIs
|
|
19
|
+
- Copy-on-write for state updates: `state.copy(field = newValue)`
|
|
20
|
+
|
|
21
|
+
## Naming
|
|
22
|
+
|
|
23
|
+
Follow Kotlin conventions:
|
|
24
|
+
- `camelCase` for functions and properties
|
|
25
|
+
- `PascalCase` for classes, interfaces, objects, and type aliases
|
|
26
|
+
- `SCREAMING_SNAKE_CASE` for constants (`const val` or `@JvmStatic`)
|
|
27
|
+
- Prefix interfaces with behavior, not `I`: `Clickable` not `IClickable`
|
|
28
|
+
|
|
29
|
+
## Null Safety
|
|
30
|
+
|
|
31
|
+
- Never use `!!` — prefer `?.`, `?:`, `requireNotNull()`, or `checkNotNull()`
|
|
32
|
+
- Use `?.let {}` for scoped null-safe operations
|
|
33
|
+
- Return nullable types from functions that can legitimately have no result
|
|
34
|
+
|
|
35
|
+
```kotlin
|
|
36
|
+
// BAD
|
|
37
|
+
val name = user!!.name
|
|
38
|
+
|
|
39
|
+
// GOOD
|
|
40
|
+
val name = user?.name ?: "Unknown"
|
|
41
|
+
val name = requireNotNull(user) { "User must be set before accessing name" }.name
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Sealed Types
|
|
45
|
+
|
|
46
|
+
Use sealed classes/interfaces to model closed state hierarchies:
|
|
47
|
+
|
|
48
|
+
```kotlin
|
|
49
|
+
sealed interface UiState<out T> {
|
|
50
|
+
data object Loading : UiState<Nothing>
|
|
51
|
+
data class Success<T>(val data: T) : UiState<T>
|
|
52
|
+
data class Error(val message: String) : UiState<Nothing>
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Always use exhaustive `when` with sealed types — no `else` branch.
|
|
57
|
+
|
|
58
|
+
## Extension Functions
|
|
59
|
+
|
|
60
|
+
Use extension functions for utility operations, but keep them discoverable:
|
|
61
|
+
- Place in a file named after the receiver type (`StringExt.kt`, `FlowExt.kt`)
|
|
62
|
+
- Keep scope limited — don't add extensions to `Any` or overly generic types
|
|
63
|
+
|
|
64
|
+
## Scope Functions
|
|
65
|
+
|
|
66
|
+
Use the right scope function:
|
|
67
|
+
- `let` — null check + transform: `user?.let { greet(it) }`
|
|
68
|
+
- `run` — compute a result using receiver: `service.run { fetch(config) }`
|
|
69
|
+
- `apply` — configure an object: `builder.apply { timeout = 30 }`
|
|
70
|
+
- `also` — side effects: `result.also { log(it) }`
|
|
71
|
+
- Avoid deep nesting of scope functions (max 2 levels)
|
|
72
|
+
|
|
73
|
+
## Error Handling
|
|
74
|
+
|
|
75
|
+
- Use `Result<T>` or custom sealed types
|
|
76
|
+
- Use `runCatching {}` for wrapping throwable code
|
|
77
|
+
- Never catch `CancellationException` — always rethrow it
|
|
78
|
+
- Avoid `try-catch` for control flow
|
|
79
|
+
|
|
80
|
+
```kotlin
|
|
81
|
+
// BAD — using exceptions for control flow
|
|
82
|
+
val user = try { repository.getUser(id) } catch (e: NotFoundException) { null }
|
|
83
|
+
|
|
84
|
+
// GOOD — nullable return
|
|
85
|
+
val user: User? = repository.findUser(id)
|
|
86
|
+
```
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.kt"
|
|
4
|
+
- "**/*.kts"
|
|
5
|
+
- "**/build.gradle.kts"
|
|
6
|
+
---
|
|
7
|
+
# Kotlin Hooks
|
|
8
|
+
|
|
9
|
+
> This file extends [common/hooks.md](../common/hooks.md) with Kotlin-specific content.
|
|
10
|
+
|
|
11
|
+
## PostToolUse Hooks
|
|
12
|
+
|
|
13
|
+
Configure in `~/.claude/settings.json`:
|
|
14
|
+
|
|
15
|
+
- **ktfmt/ktlint**: Auto-format `.kt` and `.kts` files after edit
|
|
16
|
+
- **detekt**: Run static analysis after editing Kotlin files
|
|
17
|
+
- **./gradlew build**: Verify compilation after changes
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.kt"
|
|
4
|
+
- "**/*.kts"
|
|
5
|
+
---
|
|
6
|
+
# Kotlin Patterns
|
|
7
|
+
|
|
8
|
+
> This file extends [common/patterns.md](../common/patterns.md) with Kotlin and Android/KMP-specific content.
|
|
9
|
+
|
|
10
|
+
## Dependency Injection
|
|
11
|
+
|
|
12
|
+
Prefer constructor injection. Use Koin (KMP) or Hilt (Android-only):
|
|
13
|
+
|
|
14
|
+
```kotlin
|
|
15
|
+
// Koin — declare modules
|
|
16
|
+
val dataModule = module {
|
|
17
|
+
single<ItemRepository> { ItemRepositoryImpl(get(), get()) }
|
|
18
|
+
factory { GetItemsUseCase(get()) }
|
|
19
|
+
viewModelOf(::ItemListViewModel)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Hilt — annotations
|
|
23
|
+
@HiltViewModel
|
|
24
|
+
class ItemListViewModel @Inject constructor(
|
|
25
|
+
private val getItems: GetItemsUseCase
|
|
26
|
+
) : ViewModel()
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## ViewModel Pattern
|
|
30
|
+
|
|
31
|
+
Single state object, event sink, one-way data flow:
|
|
32
|
+
|
|
33
|
+
```kotlin
|
|
34
|
+
data class ScreenState(
|
|
35
|
+
val items: List<Item> = emptyList(),
|
|
36
|
+
val isLoading: Boolean = false
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
class ScreenViewModel(private val useCase: GetItemsUseCase) : ViewModel() {
|
|
40
|
+
private val _state = MutableStateFlow(ScreenState())
|
|
41
|
+
val state = _state.asStateFlow()
|
|
42
|
+
|
|
43
|
+
fun onEvent(event: ScreenEvent) {
|
|
44
|
+
when (event) {
|
|
45
|
+
is ScreenEvent.Load -> load()
|
|
46
|
+
is ScreenEvent.Delete -> delete(event.id)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Repository Pattern
|
|
53
|
+
|
|
54
|
+
- `suspend` functions return `Result<T>` or custom error type
|
|
55
|
+
- `Flow` for reactive streams
|
|
56
|
+
- Coordinate local + remote data sources
|
|
57
|
+
|
|
58
|
+
```kotlin
|
|
59
|
+
interface ItemRepository {
|
|
60
|
+
suspend fun getById(id: String): Result<Item>
|
|
61
|
+
suspend fun getAll(): Result<List<Item>>
|
|
62
|
+
fun observeAll(): Flow<List<Item>>
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## UseCase Pattern
|
|
67
|
+
|
|
68
|
+
Single responsibility, `operator fun invoke`:
|
|
69
|
+
|
|
70
|
+
```kotlin
|
|
71
|
+
class GetItemUseCase(private val repository: ItemRepository) {
|
|
72
|
+
suspend operator fun invoke(id: String): Result<Item> {
|
|
73
|
+
return repository.getById(id)
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
class GetItemsUseCase(private val repository: ItemRepository) {
|
|
78
|
+
suspend operator fun invoke(): Result<List<Item>> {
|
|
79
|
+
return repository.getAll()
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## expect/actual (KMP)
|
|
85
|
+
|
|
86
|
+
Use for platform-specific implementations:
|
|
87
|
+
|
|
88
|
+
```kotlin
|
|
89
|
+
// commonMain
|
|
90
|
+
expect fun platformName(): String
|
|
91
|
+
expect class SecureStorage {
|
|
92
|
+
fun save(key: String, value: String)
|
|
93
|
+
fun get(key: String): String?
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// androidMain
|
|
97
|
+
actual fun platformName(): String = "Android"
|
|
98
|
+
actual class SecureStorage {
|
|
99
|
+
actual fun save(key: String, value: String) { /* EncryptedSharedPreferences */ }
|
|
100
|
+
actual fun get(key: String): String? = null /* ... */
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// iosMain
|
|
104
|
+
actual fun platformName(): String = "iOS"
|
|
105
|
+
actual class SecureStorage {
|
|
106
|
+
actual fun save(key: String, value: String) { /* Keychain */ }
|
|
107
|
+
actual fun get(key: String): String? = null /* ... */
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Coroutine Patterns
|
|
112
|
+
|
|
113
|
+
- Use `viewModelScope` in ViewModels, `coroutineScope` for structured child work
|
|
114
|
+
- Use `stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), initialValue)` for StateFlow from cold Flows
|
|
115
|
+
- Use `supervisorScope` when child failures should be independent
|
|
116
|
+
|
|
117
|
+
## Builder Pattern with DSL
|
|
118
|
+
|
|
119
|
+
```kotlin
|
|
120
|
+
class HttpClientConfig {
|
|
121
|
+
var baseUrl: String = ""
|
|
122
|
+
var timeout: Long = 30_000
|
|
123
|
+
private val interceptors = mutableListOf<Interceptor>()
|
|
124
|
+
|
|
125
|
+
fun interceptor(block: () -> Interceptor) {
|
|
126
|
+
interceptors.add(block())
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
fun httpClient(block: HttpClientConfig.() -> Unit): HttpClient {
|
|
131
|
+
val config = HttpClientConfig().apply(block)
|
|
132
|
+
return HttpClient(config)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Usage
|
|
136
|
+
val client = httpClient {
|
|
137
|
+
baseUrl = "https://api.example.com"
|
|
138
|
+
timeout = 15_000
|
|
139
|
+
interceptor { AuthInterceptor(tokenProvider) }
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## References
|
|
144
|
+
|
|
145
|
+
See skill: `kotlin-coroutines-flows` for detailed coroutine patterns.
|
|
146
|
+
See skill: `android-clean-architecture` for module and layer patterns.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.kt"
|
|
4
|
+
- "**/*.kts"
|
|
5
|
+
---
|
|
6
|
+
# Kotlin Security
|
|
7
|
+
|
|
8
|
+
> This file extends [common/security.md](../common/security.md) with Kotlin and Android/KMP-specific content.
|
|
9
|
+
|
|
10
|
+
## Secrets Management
|
|
11
|
+
|
|
12
|
+
- Never hardcode API keys, tokens, or credentials in source code
|
|
13
|
+
- Use `local.properties` (git-ignored) for local development secrets
|
|
14
|
+
- Use `BuildConfig` fields generated from CI secrets for release builds
|
|
15
|
+
- Use `EncryptedSharedPreferences` (Android) or Keychain (iOS) for runtime secret storage
|
|
16
|
+
|
|
17
|
+
```kotlin
|
|
18
|
+
// BAD
|
|
19
|
+
val apiKey = "sk-abc123..."
|
|
20
|
+
|
|
21
|
+
// GOOD — from BuildConfig (generated at build time)
|
|
22
|
+
val apiKey = BuildConfig.API_KEY
|
|
23
|
+
|
|
24
|
+
// GOOD — from secure storage at runtime
|
|
25
|
+
val token = secureStorage.get("auth_token")
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Network Security
|
|
29
|
+
|
|
30
|
+
- Use HTTPS exclusively — configure `network_security_config.xml` to block cleartext
|
|
31
|
+
- Pin certificates for sensitive endpoints using OkHttp `CertificatePinner` or Ktor equivalent
|
|
32
|
+
- Set timeouts on all HTTP clients — never leave defaults (which may be infinite)
|
|
33
|
+
- Validate and sanitize all server responses before use
|
|
34
|
+
|
|
35
|
+
```xml
|
|
36
|
+
<!-- res/xml/network_security_config.xml -->
|
|
37
|
+
<network-security-config>
|
|
38
|
+
<base-config cleartextTrafficPermitted="false" />
|
|
39
|
+
</network-security-config>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Input Validation
|
|
43
|
+
|
|
44
|
+
- Validate all user input before processing or sending to API
|
|
45
|
+
- Use parameterized queries for Room/SQLDelight — never concatenate user input into SQL
|
|
46
|
+
- Sanitize file paths from user input to prevent path traversal
|
|
47
|
+
|
|
48
|
+
```kotlin
|
|
49
|
+
// BAD — SQL injection
|
|
50
|
+
@Query("SELECT * FROM items WHERE name = '$input'")
|
|
51
|
+
|
|
52
|
+
// GOOD — parameterized
|
|
53
|
+
@Query("SELECT * FROM items WHERE name = :input")
|
|
54
|
+
fun findByName(input: String): List<ItemEntity>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Data Protection
|
|
58
|
+
|
|
59
|
+
- Use `EncryptedSharedPreferences` for sensitive key-value data on Android
|
|
60
|
+
- Use `@Serializable` with explicit field names — don't leak internal property names
|
|
61
|
+
- Clear sensitive data from memory when no longer needed
|
|
62
|
+
- Use `@Keep` or ProGuard rules for serialized classes to prevent name mangling
|
|
63
|
+
|
|
64
|
+
## Authentication
|
|
65
|
+
|
|
66
|
+
- Store tokens in secure storage, not in plain SharedPreferences
|
|
67
|
+
- Implement token refresh with proper 401/403 handling
|
|
68
|
+
- Clear all auth state on logout (tokens, cached user data, cookies)
|
|
69
|
+
- Use biometric authentication (`BiometricPrompt`) for sensitive operations
|
|
70
|
+
|
|
71
|
+
## ProGuard / R8
|
|
72
|
+
|
|
73
|
+
- Keep rules for all serialized models (`@Serializable`, Gson, Moshi)
|
|
74
|
+
- Keep rules for reflection-based libraries (Koin, Retrofit)
|
|
75
|
+
- Test release builds — obfuscation can break serialization silently
|
|
76
|
+
|
|
77
|
+
## WebView Security
|
|
78
|
+
|
|
79
|
+
- Disable JavaScript unless explicitly needed: `settings.javaScriptEnabled = false`
|
|
80
|
+
- Validate URLs before loading in WebView
|
|
81
|
+
- Never expose `@JavascriptInterface` methods that access sensitive data
|
|
82
|
+
- Use `WebViewClient.shouldOverrideUrlLoading()` to control navigation
|