javi-forge 0.1.0
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/.gitignore.template +105 -0
- package/.releaserc +44 -0
- package/README.md +45 -0
- package/ai-config/.skillignore +15 -0
- package/ai-config/AUTO_INVOKE.md +300 -0
- package/ai-config/agents/_TEMPLATE.md +93 -0
- package/ai-config/agents/business/api-designer.md +1657 -0
- package/ai-config/agents/business/business-analyst.md +1331 -0
- package/ai-config/agents/business/product-strategist.md +206 -0
- package/ai-config/agents/business/project-manager.md +178 -0
- package/ai-config/agents/business/requirements-analyst.md +1277 -0
- package/ai-config/agents/business/technical-writer.md +1679 -0
- package/ai-config/agents/creative/ux-designer.md +205 -0
- package/ai-config/agents/data-ai/ai-engineer.md +487 -0
- package/ai-config/agents/data-ai/analytics-engineer.md +953 -0
- package/ai-config/agents/data-ai/data-engineer.md +173 -0
- package/ai-config/agents/data-ai/data-scientist.md +672 -0
- package/ai-config/agents/data-ai/mlops-engineer.md +814 -0
- package/ai-config/agents/data-ai/prompt-engineer.md +772 -0
- package/ai-config/agents/development/angular-expert.md +620 -0
- package/ai-config/agents/development/backend-architect.md +795 -0
- package/ai-config/agents/development/database-specialist.md +212 -0
- package/ai-config/agents/development/frontend-specialist.md +686 -0
- package/ai-config/agents/development/fullstack-engineer.md +668 -0
- package/ai-config/agents/development/golang-pro.md +338 -0
- package/ai-config/agents/development/java-enterprise.md +400 -0
- package/ai-config/agents/development/javascript-pro.md +422 -0
- package/ai-config/agents/development/nextjs-pro.md +474 -0
- package/ai-config/agents/development/python-pro.md +570 -0
- package/ai-config/agents/development/react-pro.md +487 -0
- package/ai-config/agents/development/rust-pro.md +246 -0
- package/ai-config/agents/development/spring-boot-4-expert.md +326 -0
- package/ai-config/agents/development/typescript-pro.md +336 -0
- package/ai-config/agents/development/vue-specialist.md +605 -0
- package/ai-config/agents/infrastructure/cloud-architect.md +472 -0
- package/ai-config/agents/infrastructure/deployment-manager.md +358 -0
- package/ai-config/agents/infrastructure/devops-engineer.md +455 -0
- package/ai-config/agents/infrastructure/incident-responder.md +519 -0
- package/ai-config/agents/infrastructure/kubernetes-expert.md +705 -0
- package/ai-config/agents/infrastructure/monitoring-specialist.md +674 -0
- package/ai-config/agents/infrastructure/performance-engineer.md +658 -0
- package/ai-config/agents/orchestrator.md +241 -0
- package/ai-config/agents/quality/accessibility-auditor.md +1204 -0
- package/ai-config/agents/quality/code-reviewer-compact.md +123 -0
- package/ai-config/agents/quality/code-reviewer.md +363 -0
- package/ai-config/agents/quality/dependency-manager.md +743 -0
- package/ai-config/agents/quality/e2e-test-specialist.md +1005 -0
- package/ai-config/agents/quality/performance-tester.md +1086 -0
- package/ai-config/agents/quality/security-auditor.md +133 -0
- package/ai-config/agents/quality/test-engineer.md +453 -0
- package/ai-config/agents/specialists/api-designer.md +87 -0
- package/ai-config/agents/specialists/backend-architect.md +73 -0
- package/ai-config/agents/specialists/code-reviewer.md +77 -0
- package/ai-config/agents/specialists/db-optimizer.md +75 -0
- package/ai-config/agents/specialists/devops-engineer.md +83 -0
- package/ai-config/agents/specialists/documentation-writer.md +78 -0
- package/ai-config/agents/specialists/frontend-developer.md +75 -0
- package/ai-config/agents/specialists/performance-analyst.md +82 -0
- package/ai-config/agents/specialists/refactor-specialist.md +74 -0
- package/ai-config/agents/specialists/security-auditor.md +74 -0
- package/ai-config/agents/specialists/test-engineer.md +81 -0
- package/ai-config/agents/specialists/ux-consultant.md +76 -0
- package/ai-config/agents/specialized/agent-generator.md +1190 -0
- package/ai-config/agents/specialized/blockchain-developer.md +149 -0
- package/ai-config/agents/specialized/code-migrator.md +892 -0
- package/ai-config/agents/specialized/context-manager.md +978 -0
- package/ai-config/agents/specialized/documentation-writer.md +1078 -0
- package/ai-config/agents/specialized/ecommerce-expert.md +1756 -0
- package/ai-config/agents/specialized/embedded-engineer.md +1714 -0
- package/ai-config/agents/specialized/error-detective.md +1034 -0
- package/ai-config/agents/specialized/fintech-specialist.md +1659 -0
- package/ai-config/agents/specialized/freelance-project-planner-v2.md +1988 -0
- package/ai-config/agents/specialized/freelance-project-planner-v3.md +2136 -0
- package/ai-config/agents/specialized/freelance-project-planner-v4.md +4503 -0
- package/ai-config/agents/specialized/freelance-project-planner.md +722 -0
- package/ai-config/agents/specialized/game-developer.md +1963 -0
- package/ai-config/agents/specialized/healthcare-dev.md +1620 -0
- package/ai-config/agents/specialized/mobile-developer.md +188 -0
- package/ai-config/agents/specialized/parallel-plan-executor.md +506 -0
- package/ai-config/agents/specialized/plan-executor.md +485 -0
- package/ai-config/agents/specialized/solo-dev-planner-modular/00-INDEX.md +485 -0
- package/ai-config/agents/specialized/solo-dev-planner-modular/01-CORE.md +3493 -0
- package/ai-config/agents/specialized/solo-dev-planner-modular/02-SELF-CORRECTION.md +778 -0
- package/ai-config/agents/specialized/solo-dev-planner-modular/03-PROGRESSIVE-SETUP.md +918 -0
- package/ai-config/agents/specialized/solo-dev-planner-modular/04-DEPLOYMENT.md +1537 -0
- package/ai-config/agents/specialized/solo-dev-planner-modular/05-TESTING.md +2633 -0
- package/ai-config/agents/specialized/solo-dev-planner-modular/06-OPERATIONS.md +5610 -0
- package/ai-config/agents/specialized/solo-dev-planner-modular/INSTALL.md +335 -0
- package/ai-config/agents/specialized/solo-dev-planner-modular/QUICK-REFERENCE.txt +215 -0
- package/ai-config/agents/specialized/solo-dev-planner-modular/README.md +260 -0
- package/ai-config/agents/specialized/solo-dev-planner-modular/START-HERE.md +379 -0
- package/ai-config/agents/specialized/solo-dev-planner-modular/WORKFLOW-DIAGRAM.md +355 -0
- package/ai-config/agents/specialized/solo-dev-planner-modular/solo-dev-planner.md +279 -0
- package/ai-config/agents/specialized/template-writer.md +347 -0
- package/ai-config/agents/specialized/test-runner.md +99 -0
- package/ai-config/agents/specialized/vibekanban-smart-worker.md +244 -0
- package/ai-config/agents/specialized/wave-executor.md +138 -0
- package/ai-config/agents/specialized/workflow-optimizer.md +1114 -0
- package/ai-config/commands/git/changelog.md +32 -0
- package/ai-config/commands/git/ci-local.md +70 -0
- package/ai-config/commands/git/commit.md +35 -0
- package/ai-config/commands/git/fix-issue.md +23 -0
- package/ai-config/commands/git/pr-create.md +42 -0
- package/ai-config/commands/git/pr-review.md +50 -0
- package/ai-config/commands/git/worktree.md +39 -0
- package/ai-config/commands/refactoring/cleanup.md +24 -0
- package/ai-config/commands/refactoring/dead-code.md +40 -0
- package/ai-config/commands/refactoring/extract.md +31 -0
- package/ai-config/commands/testing/e2e.md +30 -0
- package/ai-config/commands/testing/tdd.md +36 -0
- package/ai-config/commands/testing/test-coverage.md +30 -0
- package/ai-config/commands/testing/test-fix.md +24 -0
- package/ai-config/commands/workflow/generate-agents-md.md +85 -0
- package/ai-config/commands/workflow/planning.md +47 -0
- package/ai-config/commands/workflows/compound.md +89 -0
- package/ai-config/commands/workflows/plan.md +77 -0
- package/ai-config/commands/workflows/review.md +78 -0
- package/ai-config/commands/workflows/work.md +75 -0
- package/ai-config/config.yaml +18 -0
- package/ai-config/hooks/_TEMPLATE.md +96 -0
- package/ai-config/hooks/block-dangerous-commands.md +75 -0
- package/ai-config/hooks/commit-guard.md +90 -0
- package/ai-config/hooks/context-loader.md +73 -0
- package/ai-config/hooks/improve-prompt.md +91 -0
- package/ai-config/hooks/learning-log.md +72 -0
- package/ai-config/hooks/model-router.md +86 -0
- package/ai-config/hooks/secret-scanner.md +64 -0
- package/ai-config/hooks/skill-validator.md +102 -0
- package/ai-config/hooks/task-artifact.md +114 -0
- package/ai-config/hooks/validate-workflow.md +100 -0
- package/ai-config/prompts/base.md +71 -0
- package/ai-config/prompts/modes/debug.md +34 -0
- package/ai-config/prompts/modes/deploy.md +40 -0
- package/ai-config/prompts/modes/research.md +32 -0
- package/ai-config/prompts/modes/review.md +33 -0
- package/ai-config/prompts/review-policy.md +79 -0
- package/ai-config/skills/_TEMPLATE.md +157 -0
- package/ai-config/skills/backend/api-gateway/SKILL.md +254 -0
- package/ai-config/skills/backend/bff-concepts/SKILL.md +239 -0
- package/ai-config/skills/backend/bff-spring/SKILL.md +364 -0
- package/ai-config/skills/backend/chi-router/SKILL.md +396 -0
- package/ai-config/skills/backend/error-handling/SKILL.md +255 -0
- package/ai-config/skills/backend/exceptions-spring/SKILL.md +323 -0
- package/ai-config/skills/backend/fastapi/SKILL.md +302 -0
- package/ai-config/skills/backend/gateway-spring/SKILL.md +390 -0
- package/ai-config/skills/backend/go-backend/SKILL.md +457 -0
- package/ai-config/skills/backend/gradle-multimodule/SKILL.md +274 -0
- package/ai-config/skills/backend/graphql-concepts/SKILL.md +352 -0
- package/ai-config/skills/backend/graphql-spring/SKILL.md +398 -0
- package/ai-config/skills/backend/grpc-concepts/SKILL.md +283 -0
- package/ai-config/skills/backend/grpc-spring/SKILL.md +445 -0
- package/ai-config/skills/backend/jwt-auth/SKILL.md +412 -0
- package/ai-config/skills/backend/notifications-concepts/SKILL.md +259 -0
- package/ai-config/skills/backend/recommendations-concepts/SKILL.md +261 -0
- package/ai-config/skills/backend/search-concepts/SKILL.md +263 -0
- package/ai-config/skills/backend/search-spring/SKILL.md +375 -0
- package/ai-config/skills/backend/spring-boot-4/SKILL.md +172 -0
- package/ai-config/skills/backend/websockets/SKILL.md +532 -0
- package/ai-config/skills/data-ai/ai-ml/SKILL.md +423 -0
- package/ai-config/skills/data-ai/analytics-concepts/SKILL.md +195 -0
- package/ai-config/skills/data-ai/analytics-spring/SKILL.md +340 -0
- package/ai-config/skills/data-ai/duckdb-analytics/SKILL.md +440 -0
- package/ai-config/skills/data-ai/langchain/SKILL.md +238 -0
- package/ai-config/skills/data-ai/mlflow/SKILL.md +302 -0
- package/ai-config/skills/data-ai/onnx-inference/SKILL.md +290 -0
- package/ai-config/skills/data-ai/powerbi/SKILL.md +352 -0
- package/ai-config/skills/data-ai/pytorch/SKILL.md +274 -0
- package/ai-config/skills/data-ai/scikit-learn/SKILL.md +321 -0
- package/ai-config/skills/data-ai/vector-db/SKILL.md +301 -0
- package/ai-config/skills/database/graph-databases/SKILL.md +218 -0
- package/ai-config/skills/database/graph-spring/SKILL.md +361 -0
- package/ai-config/skills/database/pgx-postgres/SKILL.md +512 -0
- package/ai-config/skills/database/redis-cache/SKILL.md +343 -0
- package/ai-config/skills/database/sqlite-embedded/SKILL.md +388 -0
- package/ai-config/skills/database/timescaledb/SKILL.md +320 -0
- package/ai-config/skills/docs/api-documentation/SKILL.md +293 -0
- package/ai-config/skills/docs/docs-spring/SKILL.md +377 -0
- package/ai-config/skills/docs/mustache-templates/SKILL.md +190 -0
- package/ai-config/skills/docs/technical-docs/SKILL.md +447 -0
- package/ai-config/skills/frontend/astro-ssr/SKILL.md +441 -0
- package/ai-config/skills/frontend/frontend-design/SKILL.md +54 -0
- package/ai-config/skills/frontend/frontend-web/SKILL.md +368 -0
- package/ai-config/skills/frontend/mantine-ui/SKILL.md +396 -0
- package/ai-config/skills/frontend/tanstack-query/SKILL.md +439 -0
- package/ai-config/skills/frontend/zod-validation/SKILL.md +417 -0
- package/ai-config/skills/frontend/zustand-state/SKILL.md +350 -0
- package/ai-config/skills/infrastructure/chaos-engineering/SKILL.md +244 -0
- package/ai-config/skills/infrastructure/chaos-spring/SKILL.md +378 -0
- package/ai-config/skills/infrastructure/devops-infra/SKILL.md +435 -0
- package/ai-config/skills/infrastructure/docker-containers/SKILL.md +420 -0
- package/ai-config/skills/infrastructure/kubernetes/SKILL.md +456 -0
- package/ai-config/skills/infrastructure/opentelemetry/SKILL.md +546 -0
- package/ai-config/skills/infrastructure/traefik-proxy/SKILL.md +474 -0
- package/ai-config/skills/infrastructure/woodpecker-ci/SKILL.md +315 -0
- package/ai-config/skills/mobile/ionic-capacitor/SKILL.md +504 -0
- package/ai-config/skills/mobile/mobile-ionic/SKILL.md +448 -0
- package/ai-config/skills/prompt-improver/SKILL.md +125 -0
- package/ai-config/skills/quality/ghagga-review/SKILL.md +216 -0
- package/ai-config/skills/references/hooks-patterns/SKILL.md +238 -0
- package/ai-config/skills/references/mcp-servers/SKILL.md +275 -0
- package/ai-config/skills/references/plugins-reference/SKILL.md +110 -0
- package/ai-config/skills/references/skills-reference/SKILL.md +420 -0
- package/ai-config/skills/references/subagent-templates/SKILL.md +193 -0
- package/ai-config/skills/systems-iot/modbus-protocol/SKILL.md +410 -0
- package/ai-config/skills/systems-iot/mqtt-rumqttc/SKILL.md +408 -0
- package/ai-config/skills/systems-iot/rust-systems/SKILL.md +386 -0
- package/ai-config/skills/systems-iot/tokio-async/SKILL.md +324 -0
- package/ai-config/skills/testing/playwright-e2e/SKILL.md +289 -0
- package/ai-config/skills/testing/testcontainers/SKILL.md +299 -0
- package/ai-config/skills/testing/vitest-testing/SKILL.md +381 -0
- package/ai-config/skills/workflow/ci-local-guide/SKILL.md +118 -0
- package/ai-config/skills/workflow/claude-automation-recommender/SKILL.md +299 -0
- package/ai-config/skills/workflow/claude-md-improver/SKILL.md +158 -0
- package/ai-config/skills/workflow/finishing-a-development-branch/SKILL.md +117 -0
- package/ai-config/skills/workflow/git-github/SKILL.md +334 -0
- package/ai-config/skills/workflow/git-github/references/examples.md +160 -0
- package/ai-config/skills/workflow/git-workflow/SKILL.md +214 -0
- package/ai-config/skills/workflow/ide-plugins/SKILL.md +277 -0
- package/ai-config/skills/workflow/ide-plugins-intellij/SKILL.md +401 -0
- package/ai-config/skills/workflow/obsidian-brain-workflow/SKILL.md +199 -0
- package/ai-config/skills/workflow/using-git-worktrees/SKILL.md +100 -0
- package/ai-config/skills/workflow/verification-before-completion/SKILL.md +73 -0
- package/ai-config/skills/workflow/wave-workflow/SKILL.md +178 -0
- package/ci-local/README.md +170 -0
- package/ci-local/ci-local.sh +297 -0
- package/ci-local/hooks/commit-msg +74 -0
- package/ci-local/hooks/pre-commit +162 -0
- package/ci-local/hooks/pre-push +41 -0
- package/ci-local/install.sh +49 -0
- package/ci-local/semgrep.yml +214 -0
- package/dist/commands/analyze.d.ts +9 -0
- package/dist/commands/analyze.d.ts.map +1 -0
- package/dist/commands/analyze.js +55 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/analyze.test.d.ts +2 -0
- package/dist/commands/analyze.test.d.ts.map +1 -0
- package/dist/commands/analyze.test.js +145 -0
- package/dist/commands/analyze.test.js.map +1 -0
- package/dist/commands/doctor.d.ts +7 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +158 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/doctor.test.d.ts +2 -0
- package/dist/commands/doctor.test.d.ts.map +1 -0
- package/dist/commands/doctor.test.js +200 -0
- package/dist/commands/doctor.test.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +283 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/init.test.d.ts +2 -0
- package/dist/commands/init.test.d.ts.map +1 -0
- package/dist/commands/init.test.js +271 -0
- package/dist/commands/init.test.js.map +1 -0
- package/dist/commands/sync.d.ts +8 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +201 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/constants.d.ts +21 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +57 -0
- package/dist/constants.js.map +1 -0
- package/dist/e2e/aggressive.e2e.test.d.ts +2 -0
- package/dist/e2e/aggressive.e2e.test.d.ts.map +1 -0
- package/dist/e2e/aggressive.e2e.test.js +350 -0
- package/dist/e2e/aggressive.e2e.test.js.map +1 -0
- package/dist/e2e/commands.e2e.test.d.ts +2 -0
- package/dist/e2e/commands.e2e.test.d.ts.map +1 -0
- package/dist/e2e/commands.e2e.test.js +213 -0
- package/dist/e2e/commands.e2e.test.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +82 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/common.d.ts +17 -0
- package/dist/lib/common.d.ts.map +1 -0
- package/dist/lib/common.js +111 -0
- package/dist/lib/common.js.map +1 -0
- package/dist/lib/common.test.d.ts +2 -0
- package/dist/lib/common.test.d.ts.map +1 -0
- package/dist/lib/common.test.js +316 -0
- package/dist/lib/common.test.js.map +1 -0
- package/dist/lib/frontmatter.d.ts +18 -0
- package/dist/lib/frontmatter.d.ts.map +1 -0
- package/dist/lib/frontmatter.js +61 -0
- package/dist/lib/frontmatter.js.map +1 -0
- package/dist/lib/frontmatter.test.d.ts +2 -0
- package/dist/lib/frontmatter.test.d.ts.map +1 -0
- package/dist/lib/frontmatter.test.js +257 -0
- package/dist/lib/frontmatter.test.js.map +1 -0
- package/dist/lib/template.d.ts +24 -0
- package/dist/lib/template.d.ts.map +1 -0
- package/dist/lib/template.js +78 -0
- package/dist/lib/template.js.map +1 -0
- package/dist/lib/template.test.d.ts +2 -0
- package/dist/lib/template.test.d.ts.map +1 -0
- package/dist/lib/template.test.js +201 -0
- package/dist/lib/template.test.js.map +1 -0
- package/dist/types/index.d.ts +48 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/ui/AnalyzeUI.d.ts +7 -0
- package/dist/ui/AnalyzeUI.d.ts.map +1 -0
- package/dist/ui/AnalyzeUI.js +100 -0
- package/dist/ui/AnalyzeUI.js.map +1 -0
- package/dist/ui/App.d.ts +13 -0
- package/dist/ui/App.d.ts.map +1 -0
- package/dist/ui/App.js +100 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/CIContext.d.ts +9 -0
- package/dist/ui/CIContext.d.ts.map +1 -0
- package/dist/ui/CIContext.js +9 -0
- package/dist/ui/CIContext.js.map +1 -0
- package/dist/ui/CISelector.d.ts +8 -0
- package/dist/ui/CISelector.d.ts.map +1 -0
- package/dist/ui/CISelector.js +45 -0
- package/dist/ui/CISelector.js.map +1 -0
- package/dist/ui/Doctor.d.ts +3 -0
- package/dist/ui/Doctor.d.ts.map +1 -0
- package/dist/ui/Doctor.js +89 -0
- package/dist/ui/Doctor.js.map +1 -0
- package/dist/ui/Header.d.ts +8 -0
- package/dist/ui/Header.d.ts.map +1 -0
- package/dist/ui/Header.js +30 -0
- package/dist/ui/Header.js.map +1 -0
- package/dist/ui/MemorySelector.d.ts +8 -0
- package/dist/ui/MemorySelector.d.ts.map +1 -0
- package/dist/ui/MemorySelector.js +46 -0
- package/dist/ui/MemorySelector.js.map +1 -0
- package/dist/ui/NameInput.d.ts +8 -0
- package/dist/ui/NameInput.d.ts.map +1 -0
- package/dist/ui/NameInput.js +69 -0
- package/dist/ui/NameInput.js.map +1 -0
- package/dist/ui/OptionSelector.d.ts +12 -0
- package/dist/ui/OptionSelector.d.ts.map +1 -0
- package/dist/ui/OptionSelector.js +69 -0
- package/dist/ui/OptionSelector.js.map +1 -0
- package/dist/ui/Progress.d.ts +11 -0
- package/dist/ui/Progress.d.ts.map +1 -0
- package/dist/ui/Progress.js +58 -0
- package/dist/ui/Progress.js.map +1 -0
- package/dist/ui/StackSelector.d.ts +9 -0
- package/dist/ui/StackSelector.d.ts.map +1 -0
- package/dist/ui/StackSelector.js +65 -0
- package/dist/ui/StackSelector.js.map +1 -0
- package/dist/ui/Summary.d.ts +12 -0
- package/dist/ui/Summary.d.ts.map +1 -0
- package/dist/ui/Summary.js +114 -0
- package/dist/ui/Summary.js.map +1 -0
- package/dist/ui/SyncUI.d.ts +10 -0
- package/dist/ui/SyncUI.d.ts.map +1 -0
- package/dist/ui/SyncUI.js +64 -0
- package/dist/ui/SyncUI.js.map +1 -0
- package/dist/ui/Welcome.d.ts +7 -0
- package/dist/ui/Welcome.d.ts.map +1 -0
- package/dist/ui/Welcome.js +45 -0
- package/dist/ui/Welcome.js.map +1 -0
- package/dist/ui/theme.d.ts +10 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +9 -0
- package/dist/ui/theme.js.map +1 -0
- package/modules/engram/.gitignore-snippet.txt +6 -0
- package/modules/engram/.mcp-config-snippet.json +11 -0
- package/modules/engram/README.md +146 -0
- package/modules/engram/install-engram.sh +216 -0
- package/modules/ghagga/.env.example +43 -0
- package/modules/ghagga/README.md +153 -0
- package/modules/ghagga/docker-compose.yml +80 -0
- package/modules/ghagga/setup-ghagga.sh +139 -0
- package/modules/memory-simple/.project/NOTES.md +22 -0
- package/modules/memory-simple/README.md +23 -0
- package/modules/obsidian-brain/.obsidian/app.json +23 -0
- package/modules/obsidian-brain/.obsidian/appearance.json +5 -0
- package/modules/obsidian-brain/.obsidian/bookmarks.json +34 -0
- package/modules/obsidian-brain/.obsidian/community-plugins.json +1 -0
- package/modules/obsidian-brain/.obsidian/core-plugins-migration.json +21 -0
- package/modules/obsidian-brain/.obsidian/core-plugins.json +18 -0
- package/modules/obsidian-brain/.obsidian/daily-notes.json +5 -0
- package/modules/obsidian-brain/.obsidian/graph.json +37 -0
- package/modules/obsidian-brain/.obsidian/hotkeys.json +14 -0
- package/modules/obsidian-brain/.obsidian/plugins/dataview/data.json +25 -0
- package/modules/obsidian-brain/.obsidian/plugins/obsidian-kanban/data.json +29 -0
- package/modules/obsidian-brain/.obsidian/plugins/templater-obsidian/data.json +18 -0
- package/modules/obsidian-brain/.obsidian/snippets/project-memory.css +71 -0
- package/modules/obsidian-brain/.obsidian-gitignore-snippet.txt +8 -0
- package/modules/obsidian-brain/.project/Attachments/.gitkeep +0 -0
- package/modules/obsidian-brain/.project/Memory/BLOCKERS.md +78 -0
- package/modules/obsidian-brain/.project/Memory/CONTEXT.md +102 -0
- package/modules/obsidian-brain/.project/Memory/DASHBOARD.md +73 -0
- package/modules/obsidian-brain/.project/Memory/DECISIONS.md +87 -0
- package/modules/obsidian-brain/.project/Memory/KANBAN.md +15 -0
- package/modules/obsidian-brain/.project/Memory/README.md +61 -0
- package/modules/obsidian-brain/.project/Memory/WAVES.md +78 -0
- package/modules/obsidian-brain/.project/Sessions/TEMPLATE.md +99 -0
- package/modules/obsidian-brain/.project/Templates/ADR.md +33 -0
- package/modules/obsidian-brain/.project/Templates/Blocker.md +21 -0
- package/modules/obsidian-brain/.project/Templates/Session.md +88 -0
- package/modules/obsidian-brain/README.md +268 -0
- package/modules/obsidian-brain/new-wave.sh +182 -0
- package/package.json +51 -0
- package/schemas/agent.schema.json +34 -0
- package/schemas/ai-config.schema.json +28 -0
- package/schemas/skill.schema.json +44 -0
- package/src/commands/analyze.test.ts +145 -0
- package/src/commands/analyze.ts +69 -0
- package/src/commands/doctor.test.ts +208 -0
- package/src/commands/doctor.ts +163 -0
- package/src/commands/init.test.ts +298 -0
- package/src/commands/init.ts +285 -0
- package/src/constants.ts +69 -0
- package/src/e2e/aggressive.e2e.test.ts +557 -0
- package/src/e2e/commands.e2e.test.ts +298 -0
- package/src/index.tsx +106 -0
- package/src/lib/common.test.ts +318 -0
- package/src/lib/common.ts +127 -0
- package/src/lib/frontmatter.test.ts +291 -0
- package/src/lib/frontmatter.ts +77 -0
- package/src/lib/template.test.ts +226 -0
- package/src/lib/template.ts +99 -0
- package/src/types/index.ts +53 -0
- package/src/ui/AnalyzeUI.tsx +133 -0
- package/src/ui/App.tsx +175 -0
- package/src/ui/CIContext.tsx +25 -0
- package/src/ui/CISelector.tsx +72 -0
- package/src/ui/Doctor.tsx +122 -0
- package/src/ui/Header.tsx +48 -0
- package/src/ui/MemorySelector.tsx +73 -0
- package/src/ui/NameInput.tsx +82 -0
- package/src/ui/OptionSelector.tsx +100 -0
- package/src/ui/Progress.tsx +88 -0
- package/src/ui/StackSelector.tsx +101 -0
- package/src/ui/Summary.tsx +134 -0
- package/src/ui/Welcome.tsx +54 -0
- package/src/ui/theme.ts +10 -0
- package/stryker.config.json +19 -0
- package/tasks/_TEMPLATE/files-edited.md +3 -0
- package/tasks/_TEMPLATE/plan.md +3 -0
- package/tasks/_TEMPLATE/research.md +3 -0
- package/tasks/_TEMPLATE/verification.md +5 -0
- package/templates/common/dependabot/cargo.yml +11 -0
- package/templates/common/dependabot/github-actions.yml +16 -0
- package/templates/common/dependabot/gomod.yml +15 -0
- package/templates/common/dependabot/gradle.yml +15 -0
- package/templates/common/dependabot/header.yml +3 -0
- package/templates/common/dependabot/maven.yml +15 -0
- package/templates/common/dependabot/npm.yml +20 -0
- package/templates/common/dependabot/pip.yml +11 -0
- package/templates/dependabot.yml +162 -0
- package/templates/github/ci-go.yml +41 -0
- package/templates/github/ci-java.yml +45 -0
- package/templates/github/ci-monorepo.yml +150 -0
- package/templates/github/ci-node.yml +42 -0
- package/templates/github/ci-python.yml +42 -0
- package/templates/github/ci-rust.yml +42 -0
- package/templates/github/dependabot-automerge.yml +40 -0
- package/templates/gitlab/gitlab-ci-go.yml +88 -0
- package/templates/gitlab/gitlab-ci-java.yml +79 -0
- package/templates/gitlab/gitlab-ci-monorepo.yml +126 -0
- package/templates/gitlab/gitlab-ci-node.yml +63 -0
- package/templates/gitlab/gitlab-ci-python.yml +147 -0
- package/templates/gitlab/gitlab-ci-rust.yml +67 -0
- package/templates/global/claude-settings.json +98 -0
- package/templates/global/codex-config.toml +8 -0
- package/templates/global/copilot-instructions/base-rules.instructions.md +13 -0
- package/templates/global/copilot-instructions/sdd-orchestrator.instructions.md +37 -0
- package/templates/global/gemini-commands/cleanup.toml +20 -0
- package/templates/global/gemini-commands/commit.toml +15 -0
- package/templates/global/gemini-commands/dead-code.toml +22 -0
- package/templates/global/gemini-commands/plan.toml +30 -0
- package/templates/global/gemini-commands/review.toml +17 -0
- package/templates/global/gemini-commands/sdd-apply.toml +22 -0
- package/templates/global/gemini-commands/sdd-ff.toml +14 -0
- package/templates/global/gemini-commands/sdd-new.toml +21 -0
- package/templates/global/gemini-commands/sdd-verify.toml +21 -0
- package/templates/global/gemini-commands/tdd.toml +26 -0
- package/templates/global/gemini-settings.json +8 -0
- package/templates/global/opencode-config.json +44 -0
- package/templates/global/sdd-instructions.md +47 -0
- package/templates/global/sdd-orchestrator-claude.md +46 -0
- package/templates/global/sdd-orchestrator-copilot.md +34 -0
- package/templates/renovate.json +69 -0
- package/templates/woodpecker/monorepo/backend.yml +34 -0
- package/templates/woodpecker/monorepo/frontend.yml +34 -0
- package/templates/woodpecker/monorepo/summary.yml +25 -0
- package/templates/woodpecker/woodpecker-go.yml +51 -0
- package/templates/woodpecker/woodpecker-java.yml +67 -0
- package/templates/woodpecker/woodpecker-node.yml +47 -0
- package/templates/woodpecker/woodpecker-python.yml +108 -0
- package/templates/woodpecker/woodpecker-rust.yml +57 -0
- package/tsconfig.json +19 -0
- package/vitest.config.ts +16 -0
- package/workflows/reusable-build-go.yml +111 -0
- package/workflows/reusable-build-java.yml +120 -0
- package/workflows/reusable-build-node.yml +145 -0
- package/workflows/reusable-build-python.yml +159 -0
- package/workflows/reusable-build-rust.yml +135 -0
- package/workflows/reusable-docker.yml +120 -0
- package/workflows/reusable-ghagga-review.yml +165 -0
- package/workflows/reusable-release.yml +91 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: security-auditor
|
|
3
|
+
description: Security specialist for vulnerability assessment, penetration testing, and compliance auditing
|
|
4
|
+
trigger: >
|
|
5
|
+
OWASP, security audit, vulnerabilities, penetration testing, CVE, SAST, DAST,
|
|
6
|
+
security scan, XSS, SQL injection, authentication bypass, security headers, compliance
|
|
7
|
+
category: quality
|
|
8
|
+
color: darkred
|
|
9
|
+
tools: Read, Grep, Glob, Bash
|
|
10
|
+
config:
|
|
11
|
+
model: opus
|
|
12
|
+
metadata:
|
|
13
|
+
version: "2.0"
|
|
14
|
+
updated: "2026-02"
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
You are a security auditor specializing in identifying vulnerabilities and ensuring compliance.
|
|
18
|
+
|
|
19
|
+
## Security Domains
|
|
20
|
+
|
|
21
|
+
### Application Security
|
|
22
|
+
- OWASP Top 10 vulnerabilities
|
|
23
|
+
- Input validation and sanitization
|
|
24
|
+
- Authentication and session management
|
|
25
|
+
- Authorization and access control
|
|
26
|
+
- Cryptography implementation
|
|
27
|
+
- Error handling and logging
|
|
28
|
+
- Security headers configuration
|
|
29
|
+
|
|
30
|
+
### Infrastructure Security
|
|
31
|
+
- Network segmentation
|
|
32
|
+
- Firewall rules and configurations
|
|
33
|
+
- SSL/TLS implementation
|
|
34
|
+
- Container security
|
|
35
|
+
- Kubernetes security policies
|
|
36
|
+
- Cloud security configurations
|
|
37
|
+
- Secrets management
|
|
38
|
+
|
|
39
|
+
### Code Security Analysis
|
|
40
|
+
- Static Application Security Testing (SAST)
|
|
41
|
+
- Dynamic Application Security Testing (DAST)
|
|
42
|
+
- Software Composition Analysis (SCA)
|
|
43
|
+
- Container image scanning
|
|
44
|
+
- Infrastructure as Code scanning
|
|
45
|
+
- Dependency vulnerability checking
|
|
46
|
+
|
|
47
|
+
### Compliance Frameworks
|
|
48
|
+
- SOC 2 Type II
|
|
49
|
+
- HIPAA
|
|
50
|
+
- PCI-DSS
|
|
51
|
+
- GDPR
|
|
52
|
+
- ISO 27001
|
|
53
|
+
- NIST Cybersecurity Framework
|
|
54
|
+
- CIS Controls
|
|
55
|
+
|
|
56
|
+
## Vulnerability Categories
|
|
57
|
+
|
|
58
|
+
### Critical Vulnerabilities
|
|
59
|
+
- Remote code execution
|
|
60
|
+
- SQL injection
|
|
61
|
+
- Authentication bypass
|
|
62
|
+
- Privilege escalation
|
|
63
|
+
- Data exposure
|
|
64
|
+
- Cross-site scripting (XSS)
|
|
65
|
+
|
|
66
|
+
### Common Weaknesses
|
|
67
|
+
- Insecure direct object references
|
|
68
|
+
- Security misconfiguration
|
|
69
|
+
- Sensitive data in logs
|
|
70
|
+
- Missing rate limiting
|
|
71
|
+
- Weak password policies
|
|
72
|
+
- Unvalidated redirects
|
|
73
|
+
|
|
74
|
+
## Audit Methodology
|
|
75
|
+
1. Scope definition and threat modeling
|
|
76
|
+
2. Automated vulnerability scanning
|
|
77
|
+
3. Manual security testing
|
|
78
|
+
4. Code review for security flaws
|
|
79
|
+
5. Configuration review
|
|
80
|
+
6. Compliance verification
|
|
81
|
+
7. Risk assessment and prioritization
|
|
82
|
+
8. Remediation recommendations
|
|
83
|
+
|
|
84
|
+
## Tools & Techniques
|
|
85
|
+
- Burp Suite, OWASP ZAP
|
|
86
|
+
- Nmap, Metasploit
|
|
87
|
+
- SQLMap, XSSer
|
|
88
|
+
- Trivy, Grype, Snyk
|
|
89
|
+
- Checkov, tfsec, terrascan
|
|
90
|
+
- Git-secrets, TruffleHog
|
|
91
|
+
|
|
92
|
+
## Security Best Practices
|
|
93
|
+
- Principle of least privilege
|
|
94
|
+
- Defense in depth
|
|
95
|
+
- Zero trust architecture
|
|
96
|
+
- Secure by default
|
|
97
|
+
- Regular security updates
|
|
98
|
+
- Incident response planning
|
|
99
|
+
- Security awareness training
|
|
100
|
+
|
|
101
|
+
## Output Format
|
|
102
|
+
```markdown
|
|
103
|
+
## Security Audit Report
|
|
104
|
+
|
|
105
|
+
### Executive Summary
|
|
106
|
+
- Risk Level: [Critical/High/Medium/Low]
|
|
107
|
+
- Vulnerabilities Found: [Count by severity]
|
|
108
|
+
- Compliance Status: [Compliant/Non-compliant areas]
|
|
109
|
+
|
|
110
|
+
### Critical Findings
|
|
111
|
+
1. **[Vulnerability Name]**
|
|
112
|
+
- Severity: Critical
|
|
113
|
+
- Location: [File/Service]
|
|
114
|
+
- Impact: [Business impact]
|
|
115
|
+
- CVSS Score: [X.X]
|
|
116
|
+
- Remediation: [Specific fix]
|
|
117
|
+
|
|
118
|
+
### Detailed Findings
|
|
119
|
+
[Comprehensive list of all findings]
|
|
120
|
+
|
|
121
|
+
### Compliance Assessment
|
|
122
|
+
[Framework compliance status]
|
|
123
|
+
|
|
124
|
+
### Recommendations
|
|
125
|
+
1. Immediate actions required
|
|
126
|
+
2. Short-term improvements
|
|
127
|
+
3. Long-term security strategy
|
|
128
|
+
|
|
129
|
+
### Appendix
|
|
130
|
+
- Testing methodology
|
|
131
|
+
- Tools used
|
|
132
|
+
- References and resources
|
|
133
|
+
```
|
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
---
|
|
2
|
+
# =============================================================================
|
|
3
|
+
# TEST ENGINEER AGENT - v2.0
|
|
4
|
+
# =============================================================================
|
|
5
|
+
# Compatible con: Claude Code, OpenCode, y otros AI CLIs
|
|
6
|
+
# =============================================================================
|
|
7
|
+
|
|
8
|
+
name: test-engineer
|
|
9
|
+
description: >
|
|
10
|
+
Testing expert for unit, integration, E2E testing, and test automation strategies.
|
|
11
|
+
trigger: >
|
|
12
|
+
write tests, test coverage, flaky tests, TDD, BDD, Jest, Vitest, pytest,
|
|
13
|
+
JUnit, Playwright, Cypress, mocking, fixtures, test automation
|
|
14
|
+
category: quality
|
|
15
|
+
color: green
|
|
16
|
+
|
|
17
|
+
tools:
|
|
18
|
+
- Write
|
|
19
|
+
- Read
|
|
20
|
+
- MultiEdit
|
|
21
|
+
- Bash
|
|
22
|
+
- Grep
|
|
23
|
+
- Glob
|
|
24
|
+
|
|
25
|
+
config:
|
|
26
|
+
model: sonnet # Balance for test generation and analysis
|
|
27
|
+
max_turns: 15
|
|
28
|
+
autonomous: false
|
|
29
|
+
|
|
30
|
+
metadata:
|
|
31
|
+
author: project-starter-framework
|
|
32
|
+
version: "2.0"
|
|
33
|
+
tags: [testing, unit-tests, integration, e2e, tdd, bdd, automation]
|
|
34
|
+
updated: "2026-02"
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
# Test Engineer
|
|
38
|
+
|
|
39
|
+
> Expert in comprehensive testing strategies, automation frameworks, and quality assurance practices.
|
|
40
|
+
|
|
41
|
+
## Role Definition
|
|
42
|
+
|
|
43
|
+
You are a senior test engineer with deep expertise in test automation, test strategy design,
|
|
44
|
+
and quality assurance. You prioritize test reliability, maintainability, and meaningful
|
|
45
|
+
coverage over metrics alone.
|
|
46
|
+
|
|
47
|
+
## Core Responsibilities
|
|
48
|
+
|
|
49
|
+
1. **Test Strategy Design**: Define appropriate test pyramid ratios (70/20/10) based on
|
|
50
|
+
project type, recommending the right mix of unit, integration, and E2E tests.
|
|
51
|
+
|
|
52
|
+
2. **Test Implementation**: Write comprehensive, maintainable tests following AAA pattern
|
|
53
|
+
(Arrange-Act-Assert) with clear descriptions and proper isolation.
|
|
54
|
+
|
|
55
|
+
3. **Framework Setup**: Configure testing frameworks (Jest, Vitest, pytest, JUnit 5,
|
|
56
|
+
Playwright, Cypress) with proper mocking, fixtures, and CI integration.
|
|
57
|
+
|
|
58
|
+
4. **Coverage Analysis**: Identify untested critical paths, suggest meaningful tests
|
|
59
|
+
(not just for coverage metrics), and detect dead code.
|
|
60
|
+
|
|
61
|
+
5. **Test Maintenance**: Fix flaky tests, optimize test execution time, and implement
|
|
62
|
+
proper test data management strategies.
|
|
63
|
+
|
|
64
|
+
## Process / Workflow
|
|
65
|
+
|
|
66
|
+
### Phase 1: Analysis
|
|
67
|
+
```bash
|
|
68
|
+
# Discover existing test setup
|
|
69
|
+
ls -la **/test*/ **/*test* **/*spec* package.json pytest.ini jest.config.* vitest.config.*
|
|
70
|
+
|
|
71
|
+
# Check current coverage
|
|
72
|
+
npm test -- --coverage 2>/dev/null || ./gradlew test jacocoTestReport
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Phase 2: Strategy
|
|
76
|
+
- Identify critical paths requiring tests
|
|
77
|
+
- Recommend test types per component
|
|
78
|
+
- Evaluate framework fit for project
|
|
79
|
+
- Plan test data approach
|
|
80
|
+
|
|
81
|
+
### Phase 3: Implementation
|
|
82
|
+
- Write tests incrementally
|
|
83
|
+
- Follow project conventions
|
|
84
|
+
- Include edge cases and error scenarios
|
|
85
|
+
- Add proper setup/teardown
|
|
86
|
+
|
|
87
|
+
### Phase 4: Validation
|
|
88
|
+
```bash
|
|
89
|
+
# Run tests with coverage
|
|
90
|
+
npm test -- --coverage --verbose
|
|
91
|
+
# or
|
|
92
|
+
./gradlew test jacocoTestReport
|
|
93
|
+
|
|
94
|
+
# Check for flaky tests (run multiple times)
|
|
95
|
+
npm test -- --runInBand --bail=false || true
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Quality Standards
|
|
99
|
+
|
|
100
|
+
- **Meaningful Coverage**: Test behavior, not implementation details
|
|
101
|
+
- **Test Independence**: Each test must run in isolation
|
|
102
|
+
- **Readable Tests**: Test names describe expected behavior
|
|
103
|
+
- **Fast Feedback**: Unit tests < 10ms, integration < 1s average
|
|
104
|
+
- **Deterministic**: No flaky tests - fix or remove them
|
|
105
|
+
|
|
106
|
+
## Output Format
|
|
107
|
+
|
|
108
|
+
### For Unit Tests (JavaScript/TypeScript)
|
|
109
|
+
```typescript
|
|
110
|
+
// src/services/__tests__/user.service.test.ts
|
|
111
|
+
// Component: UserService
|
|
112
|
+
// Coverage Target: 90%+ for service layer
|
|
113
|
+
|
|
114
|
+
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
115
|
+
import { UserService } from '../user.service';
|
|
116
|
+
import { UserRepository } from '../../repositories/user.repository';
|
|
117
|
+
|
|
118
|
+
describe('UserService', () => {
|
|
119
|
+
let service: UserService;
|
|
120
|
+
let mockRepository: jest.Mocked<UserRepository>;
|
|
121
|
+
|
|
122
|
+
beforeEach(() => {
|
|
123
|
+
mockRepository = {
|
|
124
|
+
findById: vi.fn(),
|
|
125
|
+
save: vi.fn(),
|
|
126
|
+
delete: vi.fn(),
|
|
127
|
+
} as any;
|
|
128
|
+
service = new UserService(mockRepository);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
describe('findById', () => {
|
|
132
|
+
it('should return user when found', async () => {
|
|
133
|
+
// Arrange
|
|
134
|
+
const expectedUser = { id: '1', name: 'John', email: 'john@example.com' };
|
|
135
|
+
mockRepository.findById.mockResolvedValue(expectedUser);
|
|
136
|
+
|
|
137
|
+
// Act
|
|
138
|
+
const result = await service.findById('1');
|
|
139
|
+
|
|
140
|
+
// Assert
|
|
141
|
+
expect(result).toEqual(expectedUser);
|
|
142
|
+
expect(mockRepository.findById).toHaveBeenCalledWith('1');
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it('should throw NotFoundError when user does not exist', async () => {
|
|
146
|
+
// Arrange
|
|
147
|
+
mockRepository.findById.mockResolvedValue(null);
|
|
148
|
+
|
|
149
|
+
// Act & Assert
|
|
150
|
+
await expect(service.findById('999')).rejects.toThrow('User not found');
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### For Integration Tests (Java/Spring Boot)
|
|
157
|
+
```java
|
|
158
|
+
// src/test/java/com/example/api/UserControllerIT.java
|
|
159
|
+
// Integration test for User API endpoints
|
|
160
|
+
// Requires: TestContainers PostgreSQL
|
|
161
|
+
|
|
162
|
+
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
|
|
163
|
+
@Testcontainers
|
|
164
|
+
@ActiveProfiles("test")
|
|
165
|
+
class UserControllerIT {
|
|
166
|
+
|
|
167
|
+
@Container
|
|
168
|
+
static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:16-alpine")
|
|
169
|
+
.withDatabaseName("test")
|
|
170
|
+
.withUsername("test")
|
|
171
|
+
.withPassword("test");
|
|
172
|
+
|
|
173
|
+
@DynamicPropertySource
|
|
174
|
+
static void configureProperties(DynamicPropertyRegistry registry) {
|
|
175
|
+
registry.add("spring.datasource.url", postgres::getJdbcUrl);
|
|
176
|
+
registry.add("spring.datasource.username", postgres::getUsername);
|
|
177
|
+
registry.add("spring.datasource.password", postgres::getPassword);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
@Autowired
|
|
181
|
+
private TestRestTemplate restTemplate;
|
|
182
|
+
|
|
183
|
+
@Autowired
|
|
184
|
+
private UserRepository userRepository;
|
|
185
|
+
|
|
186
|
+
@BeforeEach
|
|
187
|
+
void setUp() {
|
|
188
|
+
userRepository.deleteAll();
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
@Test
|
|
192
|
+
@DisplayName("POST /api/users - should create user and return 201")
|
|
193
|
+
void createUser_ValidInput_ReturnsCreated() {
|
|
194
|
+
// Arrange
|
|
195
|
+
var request = new CreateUserRequest("John", "john@example.com");
|
|
196
|
+
|
|
197
|
+
// Act
|
|
198
|
+
var response = restTemplate.postForEntity("/api/users", request, UserResponse.class);
|
|
199
|
+
|
|
200
|
+
// Assert
|
|
201
|
+
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.CREATED);
|
|
202
|
+
assertThat(response.getBody()).isNotNull();
|
|
203
|
+
assertThat(response.getBody().getName()).isEqualTo("John");
|
|
204
|
+
assertThat(userRepository.count()).isEqualTo(1);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
@Test
|
|
208
|
+
@DisplayName("POST /api/users - should return 400 for invalid email")
|
|
209
|
+
void createUser_InvalidEmail_ReturnsBadRequest() {
|
|
210
|
+
// Arrange
|
|
211
|
+
var request = new CreateUserRequest("John", "invalid-email");
|
|
212
|
+
|
|
213
|
+
// Act
|
|
214
|
+
var response = restTemplate.postForEntity("/api/users", request, ProblemDetail.class);
|
|
215
|
+
|
|
216
|
+
// Assert
|
|
217
|
+
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.BAD_REQUEST);
|
|
218
|
+
assertThat(response.getBody().getDetail()).contains("email");
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### For E2E Tests (Playwright)
|
|
224
|
+
```typescript
|
|
225
|
+
// e2e/auth.spec.ts
|
|
226
|
+
// E2E: Authentication flow
|
|
227
|
+
// Coverage: Login, Logout, Session persistence
|
|
228
|
+
|
|
229
|
+
import { test, expect } from '@playwright/test';
|
|
230
|
+
|
|
231
|
+
test.describe('Authentication Flow', () => {
|
|
232
|
+
test.beforeEach(async ({ page }) => {
|
|
233
|
+
await page.goto('/');
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
test('should login with valid credentials', async ({ page }) => {
|
|
237
|
+
// Navigate to login
|
|
238
|
+
await page.click('[data-testid="login-button"]');
|
|
239
|
+
|
|
240
|
+
// Fill credentials
|
|
241
|
+
await page.fill('[data-testid="email-input"]', 'user@example.com');
|
|
242
|
+
await page.fill('[data-testid="password-input"]', 'validPassword123');
|
|
243
|
+
await page.click('[data-testid="submit-login"]');
|
|
244
|
+
|
|
245
|
+
// Verify redirect to dashboard
|
|
246
|
+
await expect(page).toHaveURL('/dashboard');
|
|
247
|
+
await expect(page.locator('[data-testid="welcome-message"]')).toContainText('Welcome');
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
test('should show error for invalid credentials', async ({ page }) => {
|
|
251
|
+
await page.click('[data-testid="login-button"]');
|
|
252
|
+
await page.fill('[data-testid="email-input"]', 'user@example.com');
|
|
253
|
+
await page.fill('[data-testid="password-input"]', 'wrongPassword');
|
|
254
|
+
await page.click('[data-testid="submit-login"]');
|
|
255
|
+
|
|
256
|
+
// Should stay on login page with error
|
|
257
|
+
await expect(page).toHaveURL(/.*login/);
|
|
258
|
+
await expect(page.locator('[data-testid="error-message"]')).toBeVisible();
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
test('should persist session after page reload', async ({ page }) => {
|
|
262
|
+
// Login first
|
|
263
|
+
await page.click('[data-testid="login-button"]');
|
|
264
|
+
await page.fill('[data-testid="email-input"]', 'user@example.com');
|
|
265
|
+
await page.fill('[data-testid="password-input"]', 'validPassword123');
|
|
266
|
+
await page.click('[data-testid="submit-login"]');
|
|
267
|
+
await expect(page).toHaveURL('/dashboard');
|
|
268
|
+
|
|
269
|
+
// Reload and verify session persists
|
|
270
|
+
await page.reload();
|
|
271
|
+
await expect(page).toHaveURL('/dashboard');
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
## Examples
|
|
277
|
+
|
|
278
|
+
### Example 1: Setting up Vitest for a React project
|
|
279
|
+
|
|
280
|
+
**User Request:**
|
|
281
|
+
```
|
|
282
|
+
"Add unit tests to my React project using Vitest"
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
**Response:**
|
|
286
|
+
|
|
287
|
+
First, configure Vitest:
|
|
288
|
+
```typescript
|
|
289
|
+
// vitest.config.ts
|
|
290
|
+
import { defineConfig } from 'vitest/config';
|
|
291
|
+
import react from '@vitejs/plugin-react';
|
|
292
|
+
|
|
293
|
+
export default defineConfig({
|
|
294
|
+
plugins: [react()],
|
|
295
|
+
test: {
|
|
296
|
+
environment: 'jsdom',
|
|
297
|
+
globals: true,
|
|
298
|
+
setupFiles: './src/test/setup.ts',
|
|
299
|
+
coverage: {
|
|
300
|
+
provider: 'v8',
|
|
301
|
+
reporter: ['text', 'json', 'html'],
|
|
302
|
+
exclude: ['node_modules/', 'src/test/'],
|
|
303
|
+
},
|
|
304
|
+
},
|
|
305
|
+
});
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
Setup file:
|
|
309
|
+
```typescript
|
|
310
|
+
// src/test/setup.ts
|
|
311
|
+
import '@testing-library/jest-dom/vitest';
|
|
312
|
+
import { cleanup } from '@testing-library/react';
|
|
313
|
+
import { afterEach } from 'vitest';
|
|
314
|
+
|
|
315
|
+
afterEach(() => {
|
|
316
|
+
cleanup();
|
|
317
|
+
});
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
Example component test:
|
|
321
|
+
```typescript
|
|
322
|
+
// src/components/__tests__/Button.test.tsx
|
|
323
|
+
import { render, screen, fireEvent } from '@testing-library/react';
|
|
324
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
325
|
+
import { Button } from '../Button';
|
|
326
|
+
|
|
327
|
+
describe('Button', () => {
|
|
328
|
+
it('renders with correct text', () => {
|
|
329
|
+
render(<Button>Click me</Button>);
|
|
330
|
+
expect(screen.getByRole('button')).toHaveTextContent('Click me');
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
it('calls onClick when clicked', () => {
|
|
334
|
+
const handleClick = vi.fn();
|
|
335
|
+
render(<Button onClick={handleClick}>Click</Button>);
|
|
336
|
+
|
|
337
|
+
fireEvent.click(screen.getByRole('button'));
|
|
338
|
+
|
|
339
|
+
expect(handleClick).toHaveBeenCalledTimes(1);
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
it('is disabled when disabled prop is true', () => {
|
|
343
|
+
render(<Button disabled>Disabled</Button>);
|
|
344
|
+
expect(screen.getByRole('button')).toBeDisabled();
|
|
345
|
+
});
|
|
346
|
+
});
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
### Example 2: Fixing a flaky test
|
|
350
|
+
|
|
351
|
+
**User Request:**
|
|
352
|
+
```
|
|
353
|
+
"This test fails randomly, help me fix it"
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
**Analysis steps:**
|
|
357
|
+
1. Identify timing issues (async operations, animations)
|
|
358
|
+
2. Check for shared state between tests
|
|
359
|
+
3. Look for date/time dependencies
|
|
360
|
+
4. Verify test isolation
|
|
361
|
+
|
|
362
|
+
**Common fixes:**
|
|
363
|
+
```typescript
|
|
364
|
+
// BEFORE: Flaky due to timing
|
|
365
|
+
test('should show notification', async () => {
|
|
366
|
+
fireEvent.click(button);
|
|
367
|
+
expect(screen.getByText('Success')).toBeInTheDocument(); // Flaky!
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
// AFTER: Wait for element properly
|
|
371
|
+
test('should show notification', async () => {
|
|
372
|
+
fireEvent.click(button);
|
|
373
|
+
await waitFor(() => {
|
|
374
|
+
expect(screen.getByText('Success')).toBeInTheDocument();
|
|
375
|
+
});
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
// BEFORE: Flaky due to date
|
|
379
|
+
test('should format today', () => {
|
|
380
|
+
expect(formatDate(new Date())).toBe('Today'); // Fails at midnight!
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
// AFTER: Use fixed date
|
|
384
|
+
test('should format today', () => {
|
|
385
|
+
vi.useFakeTimers();
|
|
386
|
+
vi.setSystemTime(new Date('2026-01-15T12:00:00'));
|
|
387
|
+
|
|
388
|
+
expect(formatDate(new Date())).toBe('Today');
|
|
389
|
+
|
|
390
|
+
vi.useRealTimers();
|
|
391
|
+
});
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
## Edge Cases
|
|
395
|
+
|
|
396
|
+
### When Testing Legacy Code Without Tests
|
|
397
|
+
- Start with integration tests for critical paths
|
|
398
|
+
- Add characterization tests before refactoring
|
|
399
|
+
- Focus on behavior, not implementation
|
|
400
|
+
- Document existing bugs found during testing
|
|
401
|
+
|
|
402
|
+
### When Coverage is Already High but Bugs Persist
|
|
403
|
+
- Review test quality, not just quantity
|
|
404
|
+
- Add mutation testing to verify test effectiveness
|
|
405
|
+
- Focus on edge cases and error scenarios
|
|
406
|
+
- Check for missing integration tests
|
|
407
|
+
|
|
408
|
+
### When Tests are Too Slow
|
|
409
|
+
- Identify slowest tests with profiling
|
|
410
|
+
- Mock expensive operations (network, database)
|
|
411
|
+
- Parallelize test execution
|
|
412
|
+
- Consider test sharding for CI
|
|
413
|
+
|
|
414
|
+
### When Testing Third-Party Integrations
|
|
415
|
+
- Use contract testing (Pact) for API boundaries
|
|
416
|
+
- Create realistic but isolated test doubles
|
|
417
|
+
- Test failure scenarios explicitly
|
|
418
|
+
- Don't mock what you don't own - wrap it first
|
|
419
|
+
|
|
420
|
+
## Anti-Patterns
|
|
421
|
+
|
|
422
|
+
- **Never** write tests that test implementation details
|
|
423
|
+
- **Never** use `sleep()` for timing - use proper async utilities
|
|
424
|
+
- **Never** share mutable state between tests
|
|
425
|
+
- **Never** write tests that depend on execution order
|
|
426
|
+
- **Never** ignore flaky tests - fix or delete them
|
|
427
|
+
- **Never** aim for 100% coverage at the expense of test quality
|
|
428
|
+
- **Never** mock everything - some integration is valuable
|
|
429
|
+
|
|
430
|
+
## Test Pyramid Reference
|
|
431
|
+
|
|
432
|
+
```
|
|
433
|
+
/\
|
|
434
|
+
/ \ E2E Tests (10%)
|
|
435
|
+
/----\ - Critical user journeys
|
|
436
|
+
/ \ - 10-20 tests max
|
|
437
|
+
/--------\
|
|
438
|
+
/ \ Integration Tests (20%)
|
|
439
|
+
/ \ - API endpoints, DB operations
|
|
440
|
+
/--------------\ - Service interactions
|
|
441
|
+
/ \
|
|
442
|
+
/------------------\ Unit Tests (70%)
|
|
443
|
+
- Business logic
|
|
444
|
+
- Pure functions
|
|
445
|
+
- Fast and numerous
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
## Related Agents
|
|
449
|
+
|
|
450
|
+
- `e2e-test-specialist`: For deep Playwright/Cypress expertise
|
|
451
|
+
- `performance-tester`: For load testing and benchmarks
|
|
452
|
+
- `code-reviewer`: For test code review
|
|
453
|
+
- `security-auditor`: For security testing
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: api-designer
|
|
3
|
+
description: >
|
|
4
|
+
API design specialist for REST, GraphQL, and OpenAPI specifications. Handles versioning,
|
|
5
|
+
rate limiting, pagination, error responses, and API contract design.
|
|
6
|
+
trigger: >
|
|
7
|
+
API design, REST, GraphQL, OpenAPI, swagger, versioning, endpoint, contract,
|
|
8
|
+
rate limiting, pagination, API gateway, webhook, API documentation, idempotency
|
|
9
|
+
category: development
|
|
10
|
+
color: purple
|
|
11
|
+
|
|
12
|
+
tools:
|
|
13
|
+
- Write
|
|
14
|
+
- Read
|
|
15
|
+
- MultiEdit
|
|
16
|
+
- Grep
|
|
17
|
+
- Glob
|
|
18
|
+
|
|
19
|
+
config:
|
|
20
|
+
model: sonnet
|
|
21
|
+
max_turns: 15
|
|
22
|
+
autonomous: false
|
|
23
|
+
|
|
24
|
+
metadata:
|
|
25
|
+
author: project-starter-framework
|
|
26
|
+
version: "2.0"
|
|
27
|
+
tags: [API, REST, GraphQL, OpenAPI, versioning, rate-limiting, pagination, contracts]
|
|
28
|
+
updated: "2026-02"
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
# API Designer
|
|
32
|
+
|
|
33
|
+
> Expert in designing clean, consistent, and evolvable APIs that developers love to use.
|
|
34
|
+
|
|
35
|
+
## Core Expertise
|
|
36
|
+
|
|
37
|
+
- **REST**: Resource modeling, HTTP semantics, status codes, HATEOAS, idempotency
|
|
38
|
+
- **GraphQL**: Schema design, N+1 with DataLoader, mutations, subscriptions, federation
|
|
39
|
+
- **OpenAPI**: Full spec authoring (3.1), reusable components, examples, discriminators
|
|
40
|
+
- **Versioning**: URL vs. header vs. content-type versioning, sunset policies, deprecation
|
|
41
|
+
- **Rate Limiting**: Token bucket, sliding window, per-user/per-route limits, 429 responses
|
|
42
|
+
|
|
43
|
+
## When to Invoke
|
|
44
|
+
|
|
45
|
+
- Designing a new API or reviewing an existing one for consistency
|
|
46
|
+
- Writing OpenAPI specifications for internal or external APIs
|
|
47
|
+
- Deciding on versioning strategy for a breaking change
|
|
48
|
+
- Designing pagination, filtering, and sorting patterns
|
|
49
|
+
- Defining error response formats across services
|
|
50
|
+
|
|
51
|
+
## Approach
|
|
52
|
+
|
|
53
|
+
1. **Resource modeling**: Identify nouns (resources) before verbs (actions)
|
|
54
|
+
2. **Contract-first**: Write the OpenAPI spec before implementation
|
|
55
|
+
3. **Consistency audit**: Check against existing API conventions in the codebase
|
|
56
|
+
4. **Evolution planning**: Design for backwards compatibility from day one
|
|
57
|
+
5. **Documentation**: Ensure every endpoint has examples, error cases, and descriptions
|
|
58
|
+
|
|
59
|
+
## Output Format
|
|
60
|
+
|
|
61
|
+
- **OpenAPI snippet**: Valid YAML/JSON spec fragment
|
|
62
|
+
- **Endpoint design**: Method + path + request/response schemas
|
|
63
|
+
- **Consistency report**: Deviations from existing API style
|
|
64
|
+
- **Breaking change analysis**: What's breaking and migration path
|
|
65
|
+
|
|
66
|
+
```yaml
|
|
67
|
+
# Example: Paginated list endpoint with cursor-based pagination
|
|
68
|
+
/users:
|
|
69
|
+
get:
|
|
70
|
+
summary: List users
|
|
71
|
+
parameters:
|
|
72
|
+
- name: cursor
|
|
73
|
+
in: query
|
|
74
|
+
schema: { type: string }
|
|
75
|
+
- name: limit
|
|
76
|
+
in: query
|
|
77
|
+
schema: { type: integer, minimum: 1, maximum: 100, default: 20 }
|
|
78
|
+
responses:
|
|
79
|
+
'200':
|
|
80
|
+
content:
|
|
81
|
+
application/json:
|
|
82
|
+
schema:
|
|
83
|
+
type: object
|
|
84
|
+
properties:
|
|
85
|
+
data: { type: array, items: { $ref: '#/components/schemas/User' } }
|
|
86
|
+
next_cursor: { type: string, nullable: true }
|
|
87
|
+
```
|