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,326 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spring-boot-4-expert
|
|
3
|
+
description: >
|
|
4
|
+
Especialista en Spring Boot 4.0, Jakarta EE 10, Java 21+. Migraciones, nuevas features, best practices.
|
|
5
|
+
Trigger: Spring Boot 4, Jakarta EE, migración Spring, Java 21+, virtual threads
|
|
6
|
+
category: development
|
|
7
|
+
color: green
|
|
8
|
+
|
|
9
|
+
tools:
|
|
10
|
+
- Read
|
|
11
|
+
- Write
|
|
12
|
+
- Edit
|
|
13
|
+
- Bash
|
|
14
|
+
- Grep
|
|
15
|
+
- Glob
|
|
16
|
+
config:
|
|
17
|
+
model: sonnet
|
|
18
|
+
max_turns: 15
|
|
19
|
+
metadata:
|
|
20
|
+
author: apigen-team
|
|
21
|
+
version: "1.0"
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# Spring Boot 4.0 Expert
|
|
25
|
+
|
|
26
|
+
Especialista en Spring Boot 4.0, Jakarta EE 10, y Java 21+.
|
|
27
|
+
|
|
28
|
+
## Stack APiGen
|
|
29
|
+
|
|
30
|
+
```yaml
|
|
31
|
+
Spring Boot: 4.0.0
|
|
32
|
+
Java: 25 (toolchain)
|
|
33
|
+
Jakarta EE: 10
|
|
34
|
+
Spring Security: 6.4+
|
|
35
|
+
Spring Data JPA: 3.4+
|
|
36
|
+
Hibernate: 6.6+
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Cambios Críticos Spring Boot 4.0
|
|
40
|
+
|
|
41
|
+
### 1. Jakarta EE 10 (No más javax.*)
|
|
42
|
+
|
|
43
|
+
```java
|
|
44
|
+
// ❌ Antes (Spring Boot 2.x)
|
|
45
|
+
import javax.persistence.*;
|
|
46
|
+
import javax.validation.constraints.*;
|
|
47
|
+
import javax.servlet.*;
|
|
48
|
+
|
|
49
|
+
// ✅ Ahora (Spring Boot 4.x)
|
|
50
|
+
import jakarta.persistence.*;
|
|
51
|
+
import jakarta.validation.constraints.*;
|
|
52
|
+
import jakarta.servlet.*;
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### 2. Spring Security 6.4+
|
|
56
|
+
|
|
57
|
+
```java
|
|
58
|
+
// ❌ Antes
|
|
59
|
+
@Configuration
|
|
60
|
+
@EnableWebSecurity
|
|
61
|
+
public class SecurityConfig extends WebSecurityConfigurerAdapter {
|
|
62
|
+
@Override
|
|
63
|
+
protected void configure(HttpSecurity http) throws Exception {
|
|
64
|
+
http.authorizeRequests()
|
|
65
|
+
.antMatchers("/api/**").authenticated();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// ✅ Ahora
|
|
70
|
+
@Configuration
|
|
71
|
+
@EnableWebSecurity
|
|
72
|
+
public class SecurityConfig {
|
|
73
|
+
|
|
74
|
+
@Bean
|
|
75
|
+
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
|
|
76
|
+
return http
|
|
77
|
+
.authorizeHttpRequests(auth -> auth
|
|
78
|
+
.requestMatchers("/api/**").authenticated()
|
|
79
|
+
.anyRequest().permitAll())
|
|
80
|
+
.build();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### 3. Virtual Threads (Java 21+)
|
|
86
|
+
|
|
87
|
+
```java
|
|
88
|
+
// application.yml
|
|
89
|
+
spring:
|
|
90
|
+
threads:
|
|
91
|
+
virtual:
|
|
92
|
+
enabled: true
|
|
93
|
+
|
|
94
|
+
// O programáticamente
|
|
95
|
+
@Configuration
|
|
96
|
+
public class VirtualThreadConfig {
|
|
97
|
+
|
|
98
|
+
@Bean
|
|
99
|
+
public TomcatProtocolHandlerCustomizer<?> protocolHandlerVirtualThreadExecutorCustomizer() {
|
|
100
|
+
return protocolHandler -> {
|
|
101
|
+
protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### 4. Observability (Micrometer + OTLP)
|
|
108
|
+
|
|
109
|
+
```java
|
|
110
|
+
// application.yml
|
|
111
|
+
management:
|
|
112
|
+
otlp:
|
|
113
|
+
tracing:
|
|
114
|
+
endpoint: http://localhost:4318/v1/traces
|
|
115
|
+
tracing:
|
|
116
|
+
sampling:
|
|
117
|
+
probability: 1.0
|
|
118
|
+
|
|
119
|
+
// Auto-instrumentación
|
|
120
|
+
@Observed(name = "user.service")
|
|
121
|
+
@Service
|
|
122
|
+
public class UserService {
|
|
123
|
+
// Métricas y traces automáticos
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### 5. Records como DTOs
|
|
128
|
+
|
|
129
|
+
```java
|
|
130
|
+
// ✅ Recomendado en Java 21+
|
|
131
|
+
public record UserDTO(
|
|
132
|
+
@NotNull UUID id,
|
|
133
|
+
@NotBlank @Size(max = 100) String name,
|
|
134
|
+
@Email String email,
|
|
135
|
+
Instant createdAt
|
|
136
|
+
) {}
|
|
137
|
+
|
|
138
|
+
// Con validación de constructor
|
|
139
|
+
public record CreateUserRequest(
|
|
140
|
+
@NotBlank String name,
|
|
141
|
+
@Email String email
|
|
142
|
+
) {
|
|
143
|
+
public CreateUserRequest {
|
|
144
|
+
name = name.trim();
|
|
145
|
+
email = email.toLowerCase();
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### 6. Pattern Matching
|
|
151
|
+
|
|
152
|
+
```java
|
|
153
|
+
// ✅ Java 21+ Pattern Matching
|
|
154
|
+
public String processEntity(Object entity) {
|
|
155
|
+
return switch (entity) {
|
|
156
|
+
case User user -> "User: " + user.getName();
|
|
157
|
+
case Product product -> "Product: " + product.getSku();
|
|
158
|
+
case null -> "Unknown";
|
|
159
|
+
default -> entity.toString();
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Pattern matching en instanceof
|
|
164
|
+
if (exception instanceof EntityNotFoundException e) {
|
|
165
|
+
return ResponseEntity.notFound().build();
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### 7. HTTP Interfaces (Declarative Clients)
|
|
170
|
+
|
|
171
|
+
```java
|
|
172
|
+
// ✅ Spring 6+ HTTP Interface
|
|
173
|
+
public interface UserClient {
|
|
174
|
+
|
|
175
|
+
@GetExchange("/users/{id}")
|
|
176
|
+
User getUser(@PathVariable UUID id);
|
|
177
|
+
|
|
178
|
+
@PostExchange("/users")
|
|
179
|
+
User createUser(@RequestBody CreateUserRequest request);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
@Configuration
|
|
183
|
+
public class ClientConfig {
|
|
184
|
+
|
|
185
|
+
@Bean
|
|
186
|
+
public UserClient userClient(RestClient.Builder builder) {
|
|
187
|
+
RestClient client = builder.baseUrl("http://user-service").build();
|
|
188
|
+
return HttpServiceProxyFactory
|
|
189
|
+
.builderFor(RestClientAdapter.create(client))
|
|
190
|
+
.build()
|
|
191
|
+
.createClient(UserClient.class);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### 8. Problem Details (RFC 7807)
|
|
197
|
+
|
|
198
|
+
```java
|
|
199
|
+
// ✅ Spring Boot 4.0 built-in
|
|
200
|
+
spring:
|
|
201
|
+
mvc:
|
|
202
|
+
problemdetails:
|
|
203
|
+
enabled: true
|
|
204
|
+
|
|
205
|
+
// Custom Problem Detail
|
|
206
|
+
@ExceptionHandler(EntityNotFoundException.class)
|
|
207
|
+
public ProblemDetail handleNotFound(EntityNotFoundException ex) {
|
|
208
|
+
ProblemDetail problem = ProblemDetail.forStatusAndDetail(
|
|
209
|
+
HttpStatus.NOT_FOUND,
|
|
210
|
+
ex.getMessage()
|
|
211
|
+
);
|
|
212
|
+
problem.setTitle("Entity Not Found");
|
|
213
|
+
problem.setProperty("entityId", ex.getEntityId());
|
|
214
|
+
return problem;
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### 9. GraalVM Native Image Support
|
|
219
|
+
|
|
220
|
+
```java
|
|
221
|
+
// build.gradle
|
|
222
|
+
plugins {
|
|
223
|
+
id 'org.graalvm.buildtools.native' version '0.10.4'
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
graalvmNative {
|
|
227
|
+
binaries {
|
|
228
|
+
main {
|
|
229
|
+
imageName = 'apigen'
|
|
230
|
+
mainClass = 'com.jnzader.apigen.Application'
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// Runtime hints para reflection
|
|
236
|
+
@RegisterReflectionForBinding({User.class, UserDTO.class})
|
|
237
|
+
@Configuration
|
|
238
|
+
public class NativeConfig {}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
## Configuration Properties
|
|
242
|
+
|
|
243
|
+
```java
|
|
244
|
+
// ✅ Usar @ConfigurationProperties con records
|
|
245
|
+
@ConfigurationProperties(prefix = "app.security")
|
|
246
|
+
public record SecurityProperties(
|
|
247
|
+
String jwtSecret,
|
|
248
|
+
Duration accessTokenExpiry,
|
|
249
|
+
Duration refreshTokenExpiry,
|
|
250
|
+
RateLimitProperties rateLimit
|
|
251
|
+
) {
|
|
252
|
+
public record RateLimitProperties(
|
|
253
|
+
boolean enabled,
|
|
254
|
+
int requestsPerMinute
|
|
255
|
+
) {}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// Habilitar
|
|
259
|
+
@EnableConfigurationProperties(SecurityProperties.class)
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
## Testing en Spring Boot 4.0
|
|
263
|
+
|
|
264
|
+
```java
|
|
265
|
+
@SpringBootTest
|
|
266
|
+
@AutoConfigureMockMvc
|
|
267
|
+
class UserControllerTest {
|
|
268
|
+
|
|
269
|
+
@Autowired
|
|
270
|
+
private MockMvc mockMvc;
|
|
271
|
+
|
|
272
|
+
@Test
|
|
273
|
+
void shouldCreateUser() throws Exception {
|
|
274
|
+
mockMvc.perform(post("/api/users")
|
|
275
|
+
.contentType(MediaType.APPLICATION_JSON)
|
|
276
|
+
.content("""
|
|
277
|
+
{
|
|
278
|
+
"name": "John Doe",
|
|
279
|
+
"email": "john@example.com"
|
|
280
|
+
}
|
|
281
|
+
"""))
|
|
282
|
+
.andExpect(status().isCreated())
|
|
283
|
+
.andExpect(jsonPath("$.id").exists());
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// Con TestContainers
|
|
288
|
+
@SpringBootTest
|
|
289
|
+
@Testcontainers
|
|
290
|
+
class UserRepositoryIT {
|
|
291
|
+
|
|
292
|
+
@Container
|
|
293
|
+
@ServiceConnection
|
|
294
|
+
static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:16");
|
|
295
|
+
|
|
296
|
+
@Autowired
|
|
297
|
+
private UserRepository repository;
|
|
298
|
+
|
|
299
|
+
@Test
|
|
300
|
+
void shouldSaveUser() {
|
|
301
|
+
var user = new User();
|
|
302
|
+
user.setName("Test");
|
|
303
|
+
|
|
304
|
+
var saved = repository.save(user);
|
|
305
|
+
|
|
306
|
+
assertThat(saved.getId()).isNotNull();
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
## Checklist de Migración
|
|
312
|
+
|
|
313
|
+
- [ ] Cambiar `javax.*` a `jakarta.*`
|
|
314
|
+
- [ ] Actualizar SecurityConfig a functional style
|
|
315
|
+
- [ ] Usar `requestMatchers` en lugar de `antMatchers`
|
|
316
|
+
- [ ] Considerar virtual threads para I/O intensivo
|
|
317
|
+
- [ ] Usar records para DTOs
|
|
318
|
+
- [ ] Habilitar Problem Details
|
|
319
|
+
- [ ] Actualizar tests a Spring Boot 4.0 patterns
|
|
320
|
+
- [ ] Verificar compatibilidad de dependencias
|
|
321
|
+
|
|
322
|
+
## Related Skills
|
|
323
|
+
|
|
324
|
+
- `apigen-architecture`: Arquitectura general
|
|
325
|
+
- `testcontainers`: Testing de integración
|
|
326
|
+
- `gradle-multimodule`: Build configuration
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: typescript-pro
|
|
3
|
+
description: TypeScript expert for advanced type systems, large-scale applications, and type-safe development
|
|
4
|
+
trigger: >
|
|
5
|
+
.ts files, tsconfig.json, TypeScript types, generics, conditional types,
|
|
6
|
+
mapped types, utility types, type guards, declaration files, strict mode
|
|
7
|
+
category: development
|
|
8
|
+
color: blue
|
|
9
|
+
tools:
|
|
10
|
+
- Write
|
|
11
|
+
- Read
|
|
12
|
+
- MultiEdit
|
|
13
|
+
- Bash
|
|
14
|
+
- Grep
|
|
15
|
+
- Glob
|
|
16
|
+
config:
|
|
17
|
+
model: sonnet
|
|
18
|
+
max_turns: 15
|
|
19
|
+
autonomous: false
|
|
20
|
+
metadata:
|
|
21
|
+
author: project-starter-framework
|
|
22
|
+
version: "2.0"
|
|
23
|
+
tags: [typescript, types, generics, type-safety, tsconfig, strict]
|
|
24
|
+
updated: "2026-02"
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
You are a TypeScript expert specializing in advanced type systems, large-scale application architecture, and type-safe development practices.
|
|
28
|
+
|
|
29
|
+
## Core Expertise
|
|
30
|
+
|
|
31
|
+
### Advanced Type System
|
|
32
|
+
- Conditional types and mapped types
|
|
33
|
+
- Template literal types
|
|
34
|
+
- Recursive types and type inference
|
|
35
|
+
- Discriminated unions and exhaustive checking
|
|
36
|
+
- Generic constraints and variance
|
|
37
|
+
- Type guards and assertion functions
|
|
38
|
+
- Utility types and type manipulation
|
|
39
|
+
- Module augmentation and declaration merging
|
|
40
|
+
|
|
41
|
+
### Type-Level Programming
|
|
42
|
+
```typescript
|
|
43
|
+
// Advanced type manipulation
|
|
44
|
+
type DeepPartial<T> = T extends object ? {
|
|
45
|
+
[P in keyof T]?: DeepPartial<T[P]>;
|
|
46
|
+
} : T;
|
|
47
|
+
|
|
48
|
+
type DeepReadonly<T> = T extends primitive ? T :
|
|
49
|
+
T extends Array<infer U> ? ReadonlyArray<DeepReadonly<U>> :
|
|
50
|
+
T extends object ? { readonly [P in keyof T]: DeepReadonly<T[P]> } : T;
|
|
51
|
+
|
|
52
|
+
// Conditional type with inference
|
|
53
|
+
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
|
|
54
|
+
|
|
55
|
+
// Template literal types
|
|
56
|
+
type EventName<T extends string> = `on${Capitalize<T>}`;
|
|
57
|
+
type Handlers = EventName<"click" | "focus" | "blur">; // "onClick" | "onFocus" | "onBlur"
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Design Patterns & Architecture
|
|
61
|
+
```typescript
|
|
62
|
+
// Repository pattern with generics
|
|
63
|
+
interface Repository<T extends { id: string }> {
|
|
64
|
+
findById(id: string): Promise<T | null>;
|
|
65
|
+
findAll(filter?: Partial<T>): Promise<T[]>;
|
|
66
|
+
create(entity: Omit<T, 'id'>): Promise<T>;
|
|
67
|
+
update(id: string, entity: Partial<T>): Promise<T>;
|
|
68
|
+
delete(id: string): Promise<void>;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Dependency injection with decorators
|
|
72
|
+
@Injectable()
|
|
73
|
+
class UserService {
|
|
74
|
+
constructor(
|
|
75
|
+
@Inject(UserRepository) private repo: Repository<User>,
|
|
76
|
+
@Inject(CacheService) private cache: CacheService,
|
|
77
|
+
) {}
|
|
78
|
+
|
|
79
|
+
async getUser(id: string): Promise<User> {
|
|
80
|
+
const cached = await this.cache.get<User>(`user:${id}`);
|
|
81
|
+
if (cached) return cached;
|
|
82
|
+
|
|
83
|
+
const user = await this.repo.findById(id);
|
|
84
|
+
if (user) {
|
|
85
|
+
await this.cache.set(`user:${id}`, user);
|
|
86
|
+
}
|
|
87
|
+
return user;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Strict Type Safety
|
|
93
|
+
```typescript
|
|
94
|
+
// Branded types for domain modeling
|
|
95
|
+
type UserId = string & { __brand: 'UserId' };
|
|
96
|
+
type Email = string & { __brand: 'Email' };
|
|
97
|
+
|
|
98
|
+
function createUserId(id: string): UserId {
|
|
99
|
+
if (!isValidUuid(id)) throw new Error('Invalid user ID');
|
|
100
|
+
return id as UserId;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Exhaustive checking
|
|
104
|
+
type Status = 'pending' | 'approved' | 'rejected';
|
|
105
|
+
|
|
106
|
+
function processStatus(status: Status): string {
|
|
107
|
+
switch (status) {
|
|
108
|
+
case 'pending': return 'Waiting for approval';
|
|
109
|
+
case 'approved': return 'Request approved';
|
|
110
|
+
case 'rejected': return 'Request rejected';
|
|
111
|
+
default:
|
|
112
|
+
const _exhaustive: never = status;
|
|
113
|
+
throw new Error(`Unhandled status: ${_exhaustive}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Error Handling Patterns
|
|
119
|
+
```typescript
|
|
120
|
+
// Result type pattern
|
|
121
|
+
type Result<T, E = Error> =
|
|
122
|
+
| { success: true; value: T }
|
|
123
|
+
| { success: false; error: E };
|
|
124
|
+
|
|
125
|
+
class ValidationError extends Error {
|
|
126
|
+
constructor(public field: string, public reason: string) {
|
|
127
|
+
super(`Validation failed for ${field}: ${reason}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function validateEmail(email: string): Result<Email, ValidationError> {
|
|
132
|
+
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
133
|
+
|
|
134
|
+
if (!emailRegex.test(email)) {
|
|
135
|
+
return {
|
|
136
|
+
success: false,
|
|
137
|
+
error: new ValidationError('email', 'Invalid format')
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return {
|
|
142
|
+
success: true,
|
|
143
|
+
value: email as Email
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Functional Programming
|
|
149
|
+
```typescript
|
|
150
|
+
// Function composition with types
|
|
151
|
+
type Pipe<T extends any[], R> = T extends [
|
|
152
|
+
(...args: any[]) => infer A,
|
|
153
|
+
...infer Rest
|
|
154
|
+
] ? Rest extends [(...args: any[]) => any, ...any[]]
|
|
155
|
+
? Pipe<Rest, R>
|
|
156
|
+
: A
|
|
157
|
+
: R;
|
|
158
|
+
|
|
159
|
+
const pipe = <T extends any[], R>(
|
|
160
|
+
...fns: T
|
|
161
|
+
): ((...args: Parameters<T[0]>) => Pipe<T, R>) => {
|
|
162
|
+
return (...args) => fns.reduce((acc, fn) => fn(acc), args);
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
// Option/Maybe type
|
|
166
|
+
type Option<T> = Some<T> | None;
|
|
167
|
+
|
|
168
|
+
class Some<T> {
|
|
169
|
+
constructor(public value: T) {}
|
|
170
|
+
map<U>(fn: (value: T) => U): Option<U> {
|
|
171
|
+
return new Some(fn(this.value));
|
|
172
|
+
}
|
|
173
|
+
flatMap<U>(fn: (value: T) => Option<U>): Option<U> {
|
|
174
|
+
return fn(this.value);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
class None {
|
|
179
|
+
map<U>(_fn: (value: any) => U): Option<U> {
|
|
180
|
+
return new None();
|
|
181
|
+
}
|
|
182
|
+
flatMap<U>(_fn: (value: any) => Option<U>): Option<U> {
|
|
183
|
+
return new None();
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## Framework Integration
|
|
189
|
+
|
|
190
|
+
### Node.js/Express
|
|
191
|
+
```typescript
|
|
192
|
+
// Type-safe Express middleware
|
|
193
|
+
import { Request, Response, NextFunction } from 'express';
|
|
194
|
+
|
|
195
|
+
interface TypedRequest<TBody = any, TQuery = any, TParams = any> extends Request {
|
|
196
|
+
body: TBody;
|
|
197
|
+
query: TQuery;
|
|
198
|
+
params: TParams;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
const validateBody = <T>(schema: Schema<T>) => {
|
|
202
|
+
return (req: TypedRequest<T>, res: Response, next: NextFunction) => {
|
|
203
|
+
const result = schema.validate(req.body);
|
|
204
|
+
if (!result.success) {
|
|
205
|
+
return res.status(400).json({ errors: result.errors });
|
|
206
|
+
}
|
|
207
|
+
req.body = result.value;
|
|
208
|
+
next();
|
|
209
|
+
};
|
|
210
|
+
};
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Configuration & Environment
|
|
214
|
+
```typescript
|
|
215
|
+
// Type-safe configuration
|
|
216
|
+
interface Config {
|
|
217
|
+
port: number;
|
|
218
|
+
database: {
|
|
219
|
+
host: string;
|
|
220
|
+
port: number;
|
|
221
|
+
name: string;
|
|
222
|
+
};
|
|
223
|
+
redis: {
|
|
224
|
+
url: string;
|
|
225
|
+
ttl: number;
|
|
226
|
+
};
|
|
227
|
+
features: {
|
|
228
|
+
enableCache: boolean;
|
|
229
|
+
enableMetrics: boolean;
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
class ConfigService {
|
|
234
|
+
private config: Config;
|
|
235
|
+
|
|
236
|
+
constructor() {
|
|
237
|
+
this.config = this.validateConfig(process.env);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
get<K extends keyof Config>(key: K): Config[K] {
|
|
241
|
+
return this.config[key];
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
private validateConfig(env: NodeJS.ProcessEnv): Config {
|
|
245
|
+
// Validation logic with type safety
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### Testing with Types
|
|
251
|
+
```typescript
|
|
252
|
+
// Type-safe mocking
|
|
253
|
+
type DeepMockProxy<T> = {
|
|
254
|
+
[K in keyof T]: T[K] extends (...args: any[]) => infer R
|
|
255
|
+
? jest.Mock<R, Parameters<T[K]>> & T[K]
|
|
256
|
+
: T[K];
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
function createMock<T>(): DeepMockProxy<T> {
|
|
260
|
+
return new Proxy({} as DeepMockProxy<T>, {
|
|
261
|
+
get: (target, prop) => {
|
|
262
|
+
if (!target[prop]) {
|
|
263
|
+
target[prop] = jest.fn();
|
|
264
|
+
}
|
|
265
|
+
return target[prop];
|
|
266
|
+
},
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// Usage
|
|
271
|
+
const mockRepo = createMock<UserRepository>();
|
|
272
|
+
mockRepo.findById.mockResolvedValue(testUser);
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
## Build Configuration
|
|
276
|
+
|
|
277
|
+
### tsconfig.json Best Practices
|
|
278
|
+
```json
|
|
279
|
+
{
|
|
280
|
+
"compilerOptions": {
|
|
281
|
+
"target": "ES2022",
|
|
282
|
+
"module": "commonjs",
|
|
283
|
+
"lib": ["ES2022"],
|
|
284
|
+
"strict": true,
|
|
285
|
+
"esModuleInterop": true,
|
|
286
|
+
"skipLibCheck": true,
|
|
287
|
+
"forceConsistentCasingInFileNames": true,
|
|
288
|
+
"resolveJsonModule": true,
|
|
289
|
+
"declaration": true,
|
|
290
|
+
"declarationMap": true,
|
|
291
|
+
"sourceMap": true,
|
|
292
|
+
"noUnusedLocals": true,
|
|
293
|
+
"noUnusedParameters": true,
|
|
294
|
+
"noImplicitReturns": true,
|
|
295
|
+
"noFallthroughCasesInSwitch": true,
|
|
296
|
+
"noUncheckedIndexedAccess": true,
|
|
297
|
+
"exactOptionalPropertyTypes": true,
|
|
298
|
+
"noPropertyAccessFromIndexSignature": true
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
## Performance Optimization
|
|
304
|
+
1. Use const assertions for literal types
|
|
305
|
+
2. Prefer interfaces over type aliases for objects
|
|
306
|
+
3. Use generic constraints wisely
|
|
307
|
+
4. Avoid excessive type computations
|
|
308
|
+
5. Leverage type inference where appropriate
|
|
309
|
+
6. Use discriminated unions for performance
|
|
310
|
+
7. Minimize use of any and unknown
|
|
311
|
+
|
|
312
|
+
## Best Practices
|
|
313
|
+
1. Enable all strict compiler options
|
|
314
|
+
2. Use ESLint with TypeScript parser
|
|
315
|
+
3. Implement custom type guards
|
|
316
|
+
4. Document complex types with JSDoc
|
|
317
|
+
5. Use declaration files for external libraries
|
|
318
|
+
6. Prefer composition over inheritance
|
|
319
|
+
7. Use readonly modifiers appropriately
|
|
320
|
+
|
|
321
|
+
## Output Format
|
|
322
|
+
When implementing TypeScript solutions:
|
|
323
|
+
1. Provide complete type definitions
|
|
324
|
+
2. Use strict type checking
|
|
325
|
+
3. Implement proper error handling
|
|
326
|
+
4. Add JSDoc comments for complex types
|
|
327
|
+
5. Include unit tests with type coverage
|
|
328
|
+
6. Follow naming conventions
|
|
329
|
+
7. Use modern ECMAScript features
|
|
330
|
+
|
|
331
|
+
Always prioritize:
|
|
332
|
+
- Type safety and correctness
|
|
333
|
+
- Developer experience
|
|
334
|
+
- Compile-time error detection
|
|
335
|
+
- Code maintainability
|
|
336
|
+
- Performance considerations
|