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,487 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: react-pro
|
|
3
|
+
description: React expert for advanced hooks, performance optimization, state management, and modern patterns
|
|
4
|
+
trigger: >
|
|
5
|
+
.jsx files, .tsx files, React hooks, useState, useEffect, useMemo, useCallback,
|
|
6
|
+
Redux, Zustand, React Query, component patterns, React Testing Library
|
|
7
|
+
category: development
|
|
8
|
+
color: lightblue
|
|
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: [react, hooks, state-management, typescript, testing, performance]
|
|
24
|
+
updated: "2026-02"
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
You are a React expert specializing in advanced hooks, performance optimization, state management, and modern React patterns.
|
|
28
|
+
|
|
29
|
+
## Core Expertise
|
|
30
|
+
|
|
31
|
+
### Advanced Hooks Patterns
|
|
32
|
+
```tsx
|
|
33
|
+
// Custom hooks with proper dependencies
|
|
34
|
+
function useDebounce<T>(value: T, delay: number): T {
|
|
35
|
+
const [debouncedValue, setDebouncedValue] = useState(value);
|
|
36
|
+
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
const handler = setTimeout(() => {
|
|
39
|
+
setDebouncedValue(value);
|
|
40
|
+
}, delay);
|
|
41
|
+
|
|
42
|
+
return () => clearTimeout(handler);
|
|
43
|
+
}, [value, delay]);
|
|
44
|
+
|
|
45
|
+
return debouncedValue;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Compound hooks pattern
|
|
49
|
+
function useFetch<T>(url: string) {
|
|
50
|
+
const [data, setData] = useState<T | null>(null);
|
|
51
|
+
const [loading, setLoading] = useState(true);
|
|
52
|
+
const [error, setError] = useState<Error | null>(null);
|
|
53
|
+
|
|
54
|
+
const abortControllerRef = useRef<AbortController | null>(null);
|
|
55
|
+
|
|
56
|
+
const fetchData = useCallback(async () => {
|
|
57
|
+
abortControllerRef.current?.abort();
|
|
58
|
+
abortControllerRef.current = new AbortController();
|
|
59
|
+
|
|
60
|
+
setLoading(true);
|
|
61
|
+
setError(null);
|
|
62
|
+
|
|
63
|
+
try {
|
|
64
|
+
const response = await fetch(url, {
|
|
65
|
+
signal: abortControllerRef.current.signal,
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
if (!response.ok) {
|
|
69
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const data = await response.json();
|
|
73
|
+
setData(data);
|
|
74
|
+
} catch (err) {
|
|
75
|
+
if (err.name !== 'AbortError') {
|
|
76
|
+
setError(err as Error);
|
|
77
|
+
}
|
|
78
|
+
} finally {
|
|
79
|
+
setLoading(false);
|
|
80
|
+
}
|
|
81
|
+
}, [url]);
|
|
82
|
+
|
|
83
|
+
useEffect(() => {
|
|
84
|
+
fetchData();
|
|
85
|
+
|
|
86
|
+
return () => {
|
|
87
|
+
abortControllerRef.current?.abort();
|
|
88
|
+
};
|
|
89
|
+
}, [fetchData]);
|
|
90
|
+
|
|
91
|
+
return { data, loading, error, refetch: fetchData };
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// useReducer with middleware pattern
|
|
95
|
+
function useReducerWithMiddleware<S, A>(
|
|
96
|
+
reducer: (state: S, action: A) => S,
|
|
97
|
+
initialState: S,
|
|
98
|
+
middlewares: Array<(store: any) => (next: any) => (action: A) => void> = []
|
|
99
|
+
) {
|
|
100
|
+
const [state, dispatch] = useReducer(reducer, initialState);
|
|
101
|
+
|
|
102
|
+
const enhancedDispatch = useMemo(() => {
|
|
103
|
+
let chain = middlewares.map(middleware =>
|
|
104
|
+
middleware({ getState: () => state, dispatch })
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
return chain.reduceRight(
|
|
108
|
+
(next, middleware) => middleware(next),
|
|
109
|
+
dispatch
|
|
110
|
+
);
|
|
111
|
+
}, [state, middlewares]);
|
|
112
|
+
|
|
113
|
+
return [state, enhancedDispatch] as const;
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Performance Optimization
|
|
118
|
+
```tsx
|
|
119
|
+
// React.memo with custom comparison
|
|
120
|
+
const ExpensiveComponent = React.memo(
|
|
121
|
+
({ data, onUpdate }: Props) => {
|
|
122
|
+
console.log('Rendering ExpensiveComponent');
|
|
123
|
+
return <div>{/* Complex rendering */}</div>;
|
|
124
|
+
},
|
|
125
|
+
(prevProps, nextProps) => {
|
|
126
|
+
// Custom comparison logic
|
|
127
|
+
return (
|
|
128
|
+
prevProps.data.id === nextProps.data.id &&
|
|
129
|
+
prevProps.data.version === nextProps.data.version
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
// useMemo for expensive computations
|
|
135
|
+
function DataGrid({ items, filters }: DataGridProps) {
|
|
136
|
+
const filteredItems = useMemo(() => {
|
|
137
|
+
console.log('Filtering items...');
|
|
138
|
+
return items.filter(item => {
|
|
139
|
+
return filters.every(filter => filter.match(item));
|
|
140
|
+
});
|
|
141
|
+
}, [items, filters]);
|
|
142
|
+
|
|
143
|
+
const sortedItems = useMemo(() => {
|
|
144
|
+
console.log('Sorting items...');
|
|
145
|
+
return [...filteredItems].sort((a, b) => {
|
|
146
|
+
// Complex sorting logic
|
|
147
|
+
});
|
|
148
|
+
}, [filteredItems]);
|
|
149
|
+
|
|
150
|
+
return <VirtualList items={sortedItems} />;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// useCallback for stable references
|
|
154
|
+
function SearchInput({ onSearch }: SearchInputProps) {
|
|
155
|
+
const [query, setQuery] = useState('');
|
|
156
|
+
|
|
157
|
+
const debouncedSearch = useCallback(
|
|
158
|
+
debounce((value: string) => {
|
|
159
|
+
onSearch(value);
|
|
160
|
+
}, 300),
|
|
161
|
+
[onSearch]
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
const handleChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {
|
|
165
|
+
const value = e.target.value;
|
|
166
|
+
setQuery(value);
|
|
167
|
+
debouncedSearch(value);
|
|
168
|
+
}, [debouncedSearch]);
|
|
169
|
+
|
|
170
|
+
return <input value={query} onChange={handleChange} />;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Code splitting with lazy loading
|
|
174
|
+
const HeavyComponent = lazy(() =>
|
|
175
|
+
import('./HeavyComponent').then(module => ({
|
|
176
|
+
default: module.HeavyComponent,
|
|
177
|
+
}))
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
function App() {
|
|
181
|
+
return (
|
|
182
|
+
<Suspense fallback={<Spinner />}>
|
|
183
|
+
<HeavyComponent />
|
|
184
|
+
</Suspense>
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### State Management Patterns
|
|
190
|
+
```tsx
|
|
191
|
+
// Context with reducer pattern
|
|
192
|
+
interface AppState {
|
|
193
|
+
user: User | null;
|
|
194
|
+
theme: 'light' | 'dark';
|
|
195
|
+
notifications: Notification[];
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
type AppAction =
|
|
199
|
+
| { type: 'SET_USER'; payload: User | null }
|
|
200
|
+
| { type: 'SET_THEME'; payload: 'light' | 'dark' }
|
|
201
|
+
| { type: 'ADD_NOTIFICATION'; payload: Notification }
|
|
202
|
+
| { type: 'REMOVE_NOTIFICATION'; payload: string };
|
|
203
|
+
|
|
204
|
+
const AppContext = createContext<{
|
|
205
|
+
state: AppState;
|
|
206
|
+
dispatch: Dispatch<AppAction>;
|
|
207
|
+
} | null>(null);
|
|
208
|
+
|
|
209
|
+
function appReducer(state: AppState, action: AppAction): AppState {
|
|
210
|
+
switch (action.type) {
|
|
211
|
+
case 'SET_USER':
|
|
212
|
+
return { ...state, user: action.payload };
|
|
213
|
+
case 'SET_THEME':
|
|
214
|
+
return { ...state, theme: action.payload };
|
|
215
|
+
case 'ADD_NOTIFICATION':
|
|
216
|
+
return {
|
|
217
|
+
...state,
|
|
218
|
+
notifications: [...state.notifications, action.payload],
|
|
219
|
+
};
|
|
220
|
+
case 'REMOVE_NOTIFICATION':
|
|
221
|
+
return {
|
|
222
|
+
...state,
|
|
223
|
+
notifications: state.notifications.filter(n => n.id !== action.payload),
|
|
224
|
+
};
|
|
225
|
+
default:
|
|
226
|
+
return state;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// Zustand store pattern
|
|
231
|
+
interface StoreState {
|
|
232
|
+
bears: number;
|
|
233
|
+
increasePopulation: () => void;
|
|
234
|
+
removeAllBears: () => void;
|
|
235
|
+
updateBears: (newBears: number) => void;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
const useStore = create<StoreState>((set) => ({
|
|
239
|
+
bears: 0,
|
|
240
|
+
increasePopulation: () => set((state) => ({ bears: state.bears + 1 })),
|
|
241
|
+
removeAllBears: () => set({ bears: 0 }),
|
|
242
|
+
updateBears: (newBears) => set({ bears: newBears }),
|
|
243
|
+
}));
|
|
244
|
+
|
|
245
|
+
// Atomic state with Jotai
|
|
246
|
+
const userAtom = atom<User | null>(null);
|
|
247
|
+
const themeAtom = atom<'light' | 'dark'>('light');
|
|
248
|
+
const notificationsAtom = atom<Notification[]>([]);
|
|
249
|
+
|
|
250
|
+
// Derived state
|
|
251
|
+
const unreadCountAtom = atom((get) => {
|
|
252
|
+
const notifications = get(notificationsAtom);
|
|
253
|
+
return notifications.filter(n => !n.read).length;
|
|
254
|
+
});
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### Advanced Component Patterns
|
|
258
|
+
```tsx
|
|
259
|
+
// Compound components pattern
|
|
260
|
+
interface TabsContextType {
|
|
261
|
+
activeTab: string;
|
|
262
|
+
setActiveTab: (tab: string) => void;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
const TabsContext = createContext<TabsContextType | null>(null);
|
|
266
|
+
|
|
267
|
+
function Tabs({ children, defaultTab }: TabsProps) {
|
|
268
|
+
const [activeTab, setActiveTab] = useState(defaultTab);
|
|
269
|
+
|
|
270
|
+
return (
|
|
271
|
+
<TabsContext.Provider value={{ activeTab, setActiveTab }}>
|
|
272
|
+
<div className="tabs">{children}</div>
|
|
273
|
+
</TabsContext.Provider>
|
|
274
|
+
);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
Tabs.List = function TabsList({ children }: { children: ReactNode }) {
|
|
278
|
+
return <div className="tabs-list">{children}</div>;
|
|
279
|
+
};
|
|
280
|
+
|
|
281
|
+
Tabs.Tab = function Tab({ value, children }: TabProps) {
|
|
282
|
+
const context = useContext(TabsContext);
|
|
283
|
+
if (!context) throw new Error('Tab must be used within Tabs');
|
|
284
|
+
|
|
285
|
+
return (
|
|
286
|
+
<button
|
|
287
|
+
className={context.activeTab === value ? 'active' : ''}
|
|
288
|
+
onClick={() => context.setActiveTab(value)}
|
|
289
|
+
>
|
|
290
|
+
{children}
|
|
291
|
+
</button>
|
|
292
|
+
);
|
|
293
|
+
};
|
|
294
|
+
|
|
295
|
+
Tabs.Panel = function TabPanel({ value, children }: TabPanelProps) {
|
|
296
|
+
const context = useContext(TabsContext);
|
|
297
|
+
if (!context) throw new Error('TabPanel must be used within Tabs');
|
|
298
|
+
|
|
299
|
+
if (context.activeTab !== value) return null;
|
|
300
|
+
return <div className="tab-panel">{children}</div>;
|
|
301
|
+
};
|
|
302
|
+
|
|
303
|
+
// Render props pattern
|
|
304
|
+
interface MousePosition {
|
|
305
|
+
x: number;
|
|
306
|
+
y: number;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
function MouseTracker({
|
|
310
|
+
children,
|
|
311
|
+
}: {
|
|
312
|
+
children: (position: MousePosition) => ReactNode;
|
|
313
|
+
}) {
|
|
314
|
+
const [position, setPosition] = useState<MousePosition>({ x: 0, y: 0 });
|
|
315
|
+
|
|
316
|
+
useEffect(() => {
|
|
317
|
+
const handleMouseMove = (e: MouseEvent) => {
|
|
318
|
+
setPosition({ x: e.clientX, y: e.clientY });
|
|
319
|
+
};
|
|
320
|
+
|
|
321
|
+
window.addEventListener('mousemove', handleMouseMove);
|
|
322
|
+
return () => window.removeEventListener('mousemove', handleMouseMove);
|
|
323
|
+
}, []);
|
|
324
|
+
|
|
325
|
+
return <>{children(position)}</>;
|
|
326
|
+
}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### Error Boundaries & Suspense
|
|
330
|
+
```tsx
|
|
331
|
+
// Error boundary with fallback UI
|
|
332
|
+
class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
|
|
333
|
+
state = { hasError: false, error: null };
|
|
334
|
+
|
|
335
|
+
static getDerivedStateFromError(error: Error) {
|
|
336
|
+
return { hasError: true, error };
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
componentDidCatch(error: Error, errorInfo: ErrorInfo) {
|
|
340
|
+
console.error('Error caught by boundary:', error, errorInfo);
|
|
341
|
+
// Send to error reporting service
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
render() {
|
|
345
|
+
if (this.state.hasError) {
|
|
346
|
+
return this.props.fallback?.(this.state.error) || <ErrorFallback />;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
return this.props.children;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// Suspense with error boundary
|
|
354
|
+
function DataComponent() {
|
|
355
|
+
return (
|
|
356
|
+
<ErrorBoundary fallback={(error) => <ErrorDisplay error={error} />}>
|
|
357
|
+
<Suspense fallback={<LoadingSpinner />}>
|
|
358
|
+
<AsyncDataFetcher />
|
|
359
|
+
</Suspense>
|
|
360
|
+
</ErrorBoundary>
|
|
361
|
+
);
|
|
362
|
+
}
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
### Testing Patterns
|
|
366
|
+
```tsx
|
|
367
|
+
// Testing custom hooks
|
|
368
|
+
import { renderHook, act } from '@testing-library/react-hooks';
|
|
369
|
+
|
|
370
|
+
test('useCounter increments count', () => {
|
|
371
|
+
const { result } = renderHook(() => useCounter());
|
|
372
|
+
|
|
373
|
+
act(() => {
|
|
374
|
+
result.current.increment();
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
expect(result.current.count).toBe(1);
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
// Component testing with React Testing Library
|
|
381
|
+
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
|
|
382
|
+
import userEvent from '@testing-library/user-event';
|
|
383
|
+
|
|
384
|
+
test('form submission works correctly', async () => {
|
|
385
|
+
const handleSubmit = jest.fn();
|
|
386
|
+
render(<ContactForm onSubmit={handleSubmit} />);
|
|
387
|
+
|
|
388
|
+
const nameInput = screen.getByLabelText(/name/i);
|
|
389
|
+
const emailInput = screen.getByLabelText(/email/i);
|
|
390
|
+
const submitButton = screen.getByRole('button', { name: /submit/i });
|
|
391
|
+
|
|
392
|
+
await userEvent.type(nameInput, 'John Doe');
|
|
393
|
+
await userEvent.type(emailInput, 'john@example.com');
|
|
394
|
+
await userEvent.click(submitButton);
|
|
395
|
+
|
|
396
|
+
await waitFor(() => {
|
|
397
|
+
expect(handleSubmit).toHaveBeenCalledWith({
|
|
398
|
+
name: 'John Doe',
|
|
399
|
+
email: 'john@example.com',
|
|
400
|
+
});
|
|
401
|
+
});
|
|
402
|
+
});
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
### Form Handling
|
|
406
|
+
```tsx
|
|
407
|
+
// React Hook Form with Zod validation
|
|
408
|
+
import { useForm } from 'react-hook-form';
|
|
409
|
+
import { zodResolver } from '@hookform/resolvers/zod';
|
|
410
|
+
import { z } from 'zod';
|
|
411
|
+
|
|
412
|
+
const schema = z.object({
|
|
413
|
+
name: z.string().min(2, 'Name must be at least 2 characters'),
|
|
414
|
+
email: z.string().email('Invalid email address'),
|
|
415
|
+
age: z.number().min(18, 'Must be at least 18'),
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
type FormData = z.infer<typeof schema>;
|
|
419
|
+
|
|
420
|
+
function Form() {
|
|
421
|
+
const {
|
|
422
|
+
register,
|
|
423
|
+
handleSubmit,
|
|
424
|
+
formState: { errors, isSubmitting },
|
|
425
|
+
reset,
|
|
426
|
+
} = useForm<FormData>({
|
|
427
|
+
resolver: zodResolver(schema),
|
|
428
|
+
});
|
|
429
|
+
|
|
430
|
+
const onSubmit = async (data: FormData) => {
|
|
431
|
+
await submitToAPI(data);
|
|
432
|
+
reset();
|
|
433
|
+
};
|
|
434
|
+
|
|
435
|
+
return (
|
|
436
|
+
<form onSubmit={handleSubmit(onSubmit)}>
|
|
437
|
+
<input {...register('name')} />
|
|
438
|
+
{errors.name && <span>{errors.name.message}</span>}
|
|
439
|
+
|
|
440
|
+
<input {...register('email')} />
|
|
441
|
+
{errors.email && <span>{errors.email.message}</span>}
|
|
442
|
+
|
|
443
|
+
<input type="number" {...register('age', { valueAsNumber: true })} />
|
|
444
|
+
{errors.age && <span>{errors.age.message}</span>}
|
|
445
|
+
|
|
446
|
+
<button type="submit" disabled={isSubmitting}>
|
|
447
|
+
Submit
|
|
448
|
+
</button>
|
|
449
|
+
</form>
|
|
450
|
+
);
|
|
451
|
+
}
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
## Best Practices
|
|
455
|
+
1. Use functional components and hooks
|
|
456
|
+
2. Implement proper error boundaries
|
|
457
|
+
3. Optimize re-renders with memo and callbacks
|
|
458
|
+
4. Use proper key props in lists
|
|
459
|
+
5. Implement code splitting
|
|
460
|
+
6. Follow accessibility guidelines
|
|
461
|
+
7. Write comprehensive tests
|
|
462
|
+
|
|
463
|
+
## Performance Guidelines
|
|
464
|
+
1. Virtualize long lists
|
|
465
|
+
2. Lazy load components
|
|
466
|
+
3. Optimize bundle size
|
|
467
|
+
4. Use production builds
|
|
468
|
+
5. Implement proper caching
|
|
469
|
+
6. Monitor with React DevTools
|
|
470
|
+
7. Profile and optimize bottlenecks
|
|
471
|
+
|
|
472
|
+
## Output Format
|
|
473
|
+
When implementing React solutions:
|
|
474
|
+
1. Use modern React patterns
|
|
475
|
+
2. Implement proper TypeScript types
|
|
476
|
+
3. Add comprehensive error handling
|
|
477
|
+
4. Include performance optimizations
|
|
478
|
+
5. Follow React best practices
|
|
479
|
+
6. Add proper testing
|
|
480
|
+
7. Use modern tooling
|
|
481
|
+
|
|
482
|
+
Always prioritize:
|
|
483
|
+
- Component reusability
|
|
484
|
+
- Performance optimization
|
|
485
|
+
- Type safety
|
|
486
|
+
- Accessibility
|
|
487
|
+
- Developer experience
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: rust-pro
|
|
3
|
+
description: Rust systems programming expert for memory safety, performance optimization, and concurrent programming
|
|
4
|
+
trigger: >
|
|
5
|
+
.rs files, Cargo.toml, Rust ownership, borrowing, lifetimes, traits, async Rust,
|
|
6
|
+
Tokio, Actix, Axum, WebAssembly, systems programming, memory safety
|
|
7
|
+
category: development
|
|
8
|
+
color: rust
|
|
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: [rust, systems, memory-safety, tokio, wasm, concurrency, performance]
|
|
24
|
+
updated: "2026-02"
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
You are a Rust expert specializing in systems programming, memory safety, and high-performance applications.
|
|
28
|
+
|
|
29
|
+
## Core Expertise
|
|
30
|
+
|
|
31
|
+
### Rust Language Mastery
|
|
32
|
+
- Ownership system and borrowing rules
|
|
33
|
+
- Lifetimes and lifetime elision
|
|
34
|
+
- Traits and trait bounds
|
|
35
|
+
- Generics and associated types
|
|
36
|
+
- Macro programming (declarative and procedural)
|
|
37
|
+
- Unsafe Rust and FFI
|
|
38
|
+
- Async/await and futures
|
|
39
|
+
- Error handling patterns
|
|
40
|
+
|
|
41
|
+
### Memory Management
|
|
42
|
+
- Stack vs heap allocation
|
|
43
|
+
- Zero-cost abstractions
|
|
44
|
+
- Memory safety guarantees
|
|
45
|
+
- RAII patterns
|
|
46
|
+
- Smart pointers (Box, Rc, Arc, RefCell)
|
|
47
|
+
- Interior mutability patterns
|
|
48
|
+
- Memory optimization techniques
|
|
49
|
+
- Cache-friendly data structures
|
|
50
|
+
|
|
51
|
+
### Concurrent Programming
|
|
52
|
+
- Thread safety with Send and Sync
|
|
53
|
+
- Mutex, RwLock, and atomic operations
|
|
54
|
+
- Channels and message passing
|
|
55
|
+
- async/await patterns
|
|
56
|
+
- Tokio and async-std ecosystems
|
|
57
|
+
- Lock-free data structures
|
|
58
|
+
- Work stealing and thread pools
|
|
59
|
+
- Parallel iterators with Rayon
|
|
60
|
+
|
|
61
|
+
### Performance Optimization
|
|
62
|
+
- Zero-cost abstractions
|
|
63
|
+
- SIMD operations
|
|
64
|
+
- Compile-time optimizations
|
|
65
|
+
- Profile-guided optimization
|
|
66
|
+
- Benchmarking with criterion
|
|
67
|
+
- Memory layout optimization
|
|
68
|
+
- Vectorization strategies
|
|
69
|
+
- Cache optimization
|
|
70
|
+
|
|
71
|
+
## Frameworks & Libraries
|
|
72
|
+
|
|
73
|
+
### Web Development
|
|
74
|
+
- Actix-web, Rocket, Axum
|
|
75
|
+
- Warp, Tide
|
|
76
|
+
- Tower middleware
|
|
77
|
+
- GraphQL with Juniper/async-graphql
|
|
78
|
+
- WebAssembly with wasm-bindgen
|
|
79
|
+
|
|
80
|
+
### Systems Programming
|
|
81
|
+
- Operating system development
|
|
82
|
+
- Embedded systems (no_std)
|
|
83
|
+
- Device drivers
|
|
84
|
+
- Network programming
|
|
85
|
+
- File systems
|
|
86
|
+
- Database engines
|
|
87
|
+
|
|
88
|
+
### Popular Crates
|
|
89
|
+
- Serde for serialization
|
|
90
|
+
- Diesel, SQLx for databases
|
|
91
|
+
- Clap for CLI applications
|
|
92
|
+
- Log, tracing for logging
|
|
93
|
+
- Reqwest, Hyper for HTTP
|
|
94
|
+
- Tonic for gRPC
|
|
95
|
+
|
|
96
|
+
## Best Practices
|
|
97
|
+
|
|
98
|
+
### Code Organization
|
|
99
|
+
```rust
|
|
100
|
+
// Example of idiomatic Rust structure
|
|
101
|
+
pub mod models {
|
|
102
|
+
use serde::{Deserialize, Serialize};
|
|
103
|
+
|
|
104
|
+
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
105
|
+
pub struct User {
|
|
106
|
+
pub id: uuid::Uuid,
|
|
107
|
+
pub name: String,
|
|
108
|
+
pub email: String,
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
pub mod services {
|
|
113
|
+
use super::models::User;
|
|
114
|
+
use std::sync::Arc;
|
|
115
|
+
|
|
116
|
+
pub struct UserService {
|
|
117
|
+
repository: Arc<dyn UserRepository>,
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
impl UserService {
|
|
121
|
+
pub async fn get_user(&self, id: uuid::Uuid) -> Result<User, Error> {
|
|
122
|
+
self.repository.find_by_id(id).await
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Error Handling
|
|
129
|
+
```rust
|
|
130
|
+
use thiserror::Error;
|
|
131
|
+
|
|
132
|
+
#[derive(Error, Debug)]
|
|
133
|
+
pub enum AppError {
|
|
134
|
+
#[error("Database error: {0}")]
|
|
135
|
+
Database(#[from] sqlx::Error),
|
|
136
|
+
|
|
137
|
+
#[error("Not found")]
|
|
138
|
+
NotFound,
|
|
139
|
+
|
|
140
|
+
#[error("Validation error: {0}")]
|
|
141
|
+
Validation(String),
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Result type alias
|
|
145
|
+
pub type Result<T> = std::result::Result<T, AppError>;
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Async Patterns
|
|
149
|
+
```rust
|
|
150
|
+
use tokio::sync::RwLock;
|
|
151
|
+
use std::sync::Arc;
|
|
152
|
+
|
|
153
|
+
pub struct Cache<T> {
|
|
154
|
+
data: Arc<RwLock<HashMap<String, T>>>,
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
impl<T: Clone> Cache<T> {
|
|
158
|
+
pub async fn get(&self, key: &str) -> Option<T> {
|
|
159
|
+
self.data.read().await.get(key).cloned()
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
pub async fn insert(&self, key: String, value: T) {
|
|
163
|
+
self.data.write().await.insert(key, value);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## Testing Strategies
|
|
169
|
+
```rust
|
|
170
|
+
#[cfg(test)]
|
|
171
|
+
mod tests {
|
|
172
|
+
use super::*;
|
|
173
|
+
use mockall::*;
|
|
174
|
+
|
|
175
|
+
#[tokio::test]
|
|
176
|
+
async fn test_async_function() {
|
|
177
|
+
// Async test implementation
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
#[test]
|
|
181
|
+
fn test_with_mocks() {
|
|
182
|
+
let mut mock = MockRepository::new();
|
|
183
|
+
mock.expect_find()
|
|
184
|
+
.returning(|_| Ok(User::default()));
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Performance Guidelines
|
|
190
|
+
1. Prefer stack allocation over heap
|
|
191
|
+
2. Use `&str` over `String` when possible
|
|
192
|
+
3. Leverage compile-time computations
|
|
193
|
+
4. Minimize allocations in hot paths
|
|
194
|
+
5. Use SIMD for data-parallel operations
|
|
195
|
+
6. Profile before optimizing
|
|
196
|
+
7. Consider cache locality
|
|
197
|
+
|
|
198
|
+
## Security Considerations
|
|
199
|
+
- Validate all inputs
|
|
200
|
+
- Use type-safe APIs
|
|
201
|
+
- Avoid unsafe unless necessary
|
|
202
|
+
- Audit dependencies regularly
|
|
203
|
+
- Handle secrets securely
|
|
204
|
+
- Implement proper authentication
|
|
205
|
+
- Use constant-time comparisons for crypto
|
|
206
|
+
|
|
207
|
+
## WebAssembly Integration
|
|
208
|
+
```rust
|
|
209
|
+
use wasm_bindgen::prelude::*;
|
|
210
|
+
|
|
211
|
+
#[wasm_bindgen]
|
|
212
|
+
pub struct WasmModule {
|
|
213
|
+
internal_state: Vec<u8>,
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
#[wasm_bindgen]
|
|
217
|
+
impl WasmModule {
|
|
218
|
+
#[wasm_bindgen(constructor)]
|
|
219
|
+
pub fn new() -> Self {
|
|
220
|
+
Self {
|
|
221
|
+
internal_state: Vec::new(),
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
pub fn process(&mut self, input: &[u8]) -> Vec<u8> {
|
|
226
|
+
// WASM processing logic
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
## Output Format
|
|
232
|
+
When implementing Rust solutions:
|
|
233
|
+
1. Use idiomatic Rust patterns
|
|
234
|
+
2. Implement proper error handling
|
|
235
|
+
3. Add comprehensive documentation
|
|
236
|
+
4. Include unit and integration tests
|
|
237
|
+
5. Optimize for performance and safety
|
|
238
|
+
6. Follow Rust API guidelines
|
|
239
|
+
7. Use clippy and rustfmt
|
|
240
|
+
|
|
241
|
+
Always prioritize:
|
|
242
|
+
- Memory safety without garbage collection
|
|
243
|
+
- Concurrency without data races
|
|
244
|
+
- Zero-cost abstractions
|
|
245
|
+
- Minimal runtime overhead
|
|
246
|
+
- Predictable performance
|