@ngxtm/devkit 3.7.0 → 3.9.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/cli/init.js +23 -7
- package/cli/update.js +21 -6
- package/merged-commands/3d-web-experience.md +254 -0
- package/merged-commands/ab-test-setup.md +232 -0
- package/merged-commands/accessibility-compliance-accessibility-audit.md +42 -0
- package/merged-commands/active-directory-attacks.md +383 -0
- package/merged-commands/address-github-comments.md +55 -0
- package/merged-commands/aesthetic.md +134 -0
- package/merged-commands/agent-evaluation.md +64 -0
- package/merged-commands/agent-framework-azure-hosted-agents.md +332 -0
- package/merged-commands/agent-manager-skill.md +40 -0
- package/merged-commands/agent-memory-mcp.md +82 -0
- package/merged-commands/agent-memory-systems.md +67 -0
- package/merged-commands/agent-orchestration-improve-agent.md +349 -0
- package/merged-commands/agent-orchestration-multi-agent-optimize.md +239 -0
- package/merged-commands/agent-tool-builder.md +53 -0
- package/merged-commands/agile-product-owner.md +31 -0
- package/merged-commands/ai-agents-architect.md +90 -0
- package/merged-commands/ai-artist.md +75 -0
- package/merged-commands/ai-engineer.md +171 -0
- package/merged-commands/ai-multimodal.md +109 -0
- package/merged-commands/ai-product.md +54 -0
- package/merged-commands/ai-wrapper-product.md +273 -0
- package/merged-commands/airflow-dag-patterns.md +41 -0
- package/merged-commands/algolia-search.md +66 -0
- package/merged-commands/algorithmic-art.md +405 -0
- package/merged-commands/analytics-tracking.md +404 -0
- package/merged-commands/angular-architect.md +97 -0
- package/merged-commands/angular-migration.md +428 -0
- package/merged-commands/anti-reversing-techniques.md +42 -0
- package/merged-commands/api-design-principles.md +37 -0
- package/merged-commands/api-designer.md +101 -0
- package/merged-commands/api-documentation-generator.md +484 -0
- package/merged-commands/api-documenter.md +184 -0
- package/merged-commands/api-fuzzing-bug-bounty.md +433 -0
- package/merged-commands/api-patterns.md +81 -0
- package/merged-commands/api-security-best-practices.md +907 -0
- package/merged-commands/api-testing-observability-api-mock.md +46 -0
- package/merged-commands/app-builder.md +75 -0
- package/merged-commands/app-store-optimization.md +403 -0
- package/merged-commands/application-performance-performance-optimization.md +154 -0
- package/merged-commands/architect-review.md +174 -0
- package/merged-commands/architecture-decision-records.md +441 -0
- package/merged-commands/architecture-designer.md +89 -0
- package/merged-commands/architecture-patterns.md +37 -0
- package/merged-commands/architecture.md +55 -0
- package/merged-commands/arm-cortex-expert.md +306 -0
- package/merged-commands/artifacts-builder.md +74 -0
- package/merged-commands/ask-questions-if-underspecified.md +81 -0
- package/merged-commands/async-python-patterns.md +39 -0
- package/merged-commands/atlassian-mcp.md +100 -0
- package/merged-commands/attack-tree-construction.md +38 -0
- package/merged-commands/auth-implementation-patterns.md +39 -0
- package/merged-commands/automate-whatsapp.md +257 -0
- package/merged-commands/autonomous-agent-patterns.md +761 -0
- package/merged-commands/autonomous-agents.md +68 -0
- package/merged-commands/avalonia-layout-zafiro.md +59 -0
- package/merged-commands/avalonia-viewmodels-zafiro.md +29 -0
- package/merged-commands/avalonia-zafiro-development.md +29 -0
- package/merged-commands/aws-agentic-ai.md +117 -0
- package/merged-commands/aws-cdk-development.md +278 -0
- package/merged-commands/aws-cost-operations.md +317 -0
- package/merged-commands/aws-penetration-testing.md +405 -0
- package/merged-commands/aws-serverless-eda.md +757 -0
- package/merged-commands/aws-serverless.md +323 -0
- package/merged-commands/aws-skills.md +22 -0
- package/merged-commands/azd-deployment.md +296 -0
- package/merged-commands/azure-ai-agents-python.md +277 -0
- package/merged-commands/azure-ai-search-python.md +198 -0
- package/merged-commands/azure-ai-voicelive-skill.md +294 -0
- package/merged-commands/azure-functions.md +42 -0
- package/merged-commands/backend-architect.md +333 -0
- package/merged-commands/backend-dev-guidelines.md +342 -0
- package/merged-commands/backend-development-feature-development.md +180 -0
- package/merged-commands/backend-development.md +155 -0
- package/merged-commands/backend-security-coder.md +156 -0
- package/merged-commands/backtesting-frameworks.md +39 -0
- package/merged-commands/bash-defensive-patterns.md +43 -0
- package/merged-commands/bash-linux.md +199 -0
- package/merged-commands/bash-pro.md +310 -0
- package/merged-commands/bats-testing-patterns.md +34 -0
- package/merged-commands/bazel-build-optimization.md +397 -0
- package/merged-commands/beautiful-prose.md +22 -0
- package/merged-commands/behavioral-modes.md +242 -0
- package/merged-commands/best-practices.md +500 -0
- package/merged-commands/better-auth.md +204 -0
- package/merged-commands/billing-automation.md +42 -0
- package/merged-commands/binary-analysis-patterns.md +450 -0
- package/merged-commands/blockchain-developer.md +208 -0
- package/merged-commands/blockrun.md +292 -0
- package/merged-commands/brainstorming.md +230 -0
- package/merged-commands/brand-guidelines-anthropic.md +73 -0
- package/merged-commands/brand-guidelines-community.md +73 -0
- package/merged-commands/brand-guidelines.md +73 -0
- package/merged-commands/broken-authentication.md +476 -0
- package/merged-commands/browser-automation.md +70 -0
- package/merged-commands/browser-extension-builder.md +261 -0
- package/merged-commands/building-ai-agent-on-cloudflare.md +391 -0
- package/merged-commands/building-mcp-server-on-cloudflare.md +265 -0
- package/merged-commands/bullmq-specialist.md +57 -0
- package/merged-commands/bun-development.md +691 -0
- package/merged-commands/burp-suite-testing.md +380 -0
- package/merged-commands/business-analyst.md +182 -0
- package/merged-commands/busybox-on-windows.md +30 -0
- package/merged-commands/c-pro.md +56 -0
- package/merged-commands/c4-architecture-c4-architecture.md +389 -0
- package/merged-commands/c4-code.md +244 -0
- package/merged-commands/c4-component.md +153 -0
- package/merged-commands/c4-container.md +171 -0
- package/merged-commands/c4-context.md +150 -0
- package/merged-commands/canvas-design.md +130 -0
- package/merged-commands/cc-skill-backend-patterns.md +584 -0
- package/merged-commands/cc-skill-clickhouse-io.md +431 -0
- package/merged-commands/cc-skill-coding-standards.md +522 -0
- package/merged-commands/cc-skill-continuous-learning.md +10 -0
- package/merged-commands/cc-skill-frontend-patterns.md +633 -0
- package/merged-commands/cc-skill-project-guidelines-example.md +352 -0
- package/merged-commands/cc-skill-security-review.md +496 -0
- package/merged-commands/cc-skill-strategic-compact.md +10 -0
- package/merged-commands/changelog-automation.md +38 -0
- package/merged-commands/changelog-generator.md +104 -0
- package/merged-commands/chaos-engineer.md +98 -0
- package/merged-commands/chrome-devtools.md +407 -0
- package/merged-commands/cicd-automation-workflow-automate.md +51 -0
- package/merged-commands/clarity-gate.md +22 -0
- package/merged-commands/claude-ally-health.md +22 -0
- package/merged-commands/claude-code-guide.md +68 -0
- package/merged-commands/claude-d3js-skill.md +820 -0
- package/merged-commands/claude-scientific-skills.md +22 -0
- package/merged-commands/claude-speed-reader.md +22 -0
- package/merged-commands/claude-win11-speckit-update-skill.md +22 -0
- package/merged-commands/clean-code.md +201 -0
- package/merged-commands/clerk-auth.md +56 -0
- package/merged-commands/cli-developer.md +97 -0
- package/merged-commands/cloud-architect.md +135 -0
- package/merged-commands/cloud-penetration-testing.md +501 -0
- package/merged-commands/cloudflare-expert.md +227 -0
- package/merged-commands/code-documentation-code-explain.md +46 -0
- package/merged-commands/code-documentation-doc-generate.md +48 -0
- package/merged-commands/code-documentation.md +263 -0
- package/merged-commands/code-documenter.md +95 -0
- package/merged-commands/code-refactoring-context-restore.md +179 -0
- package/merged-commands/code-refactoring-refactor-clean.md +51 -0
- package/merged-commands/code-refactoring-tech-debt.md +386 -0
- package/merged-commands/code-refactoring.md +209 -0
- package/merged-commands/code-review-ai-ai-review.md +450 -0
- package/merged-commands/code-review-checklist.md +444 -0
- package/merged-commands/code-review-excellence.md +40 -0
- package/merged-commands/code-review.md +121 -0
- package/merged-commands/code-reviewer.md +178 -0
- package/merged-commands/codebase-cleanup-deps-audit.md +51 -0
- package/merged-commands/codebase-cleanup-refactor-clean.md +51 -0
- package/merged-commands/codebase-cleanup-tech-debt.md +386 -0
- package/merged-commands/codex-review.md +37 -0
- package/merged-commands/commit.md +171 -0
- package/merged-commands/competitive-ads-extractor.md +293 -0
- package/merged-commands/competitive-landscape.md +34 -0
- package/merged-commands/competitor-alternatives.md +750 -0
- package/merged-commands/comprehensive-review-full-review.md +146 -0
- package/merged-commands/comprehensive-review-pr-enhance.md +46 -0
- package/merged-commands/computer-use-agents.md +315 -0
- package/merged-commands/concise-planning.md +62 -0
- package/merged-commands/conductor-implement.md +388 -0
- package/merged-commands/conductor-manage.md +39 -0
- package/merged-commands/conductor-new-track.md +433 -0
- package/merged-commands/conductor-revert.md +372 -0
- package/merged-commands/conductor-setup.md +426 -0
- package/merged-commands/conductor-status.md +338 -0
- package/merged-commands/conductor-validator.md +62 -0
- package/merged-commands/content-creator.md +248 -0
- package/merged-commands/content-marketer.md +170 -0
- package/merged-commands/content-research-writer.md +538 -0
- package/merged-commands/context-compression.md +266 -0
- package/merged-commands/context-degradation.md +238 -0
- package/merged-commands/context-driven-development.md +400 -0
- package/merged-commands/context-engineering.md +107 -0
- package/merged-commands/context-fundamentals.md +192 -0
- package/merged-commands/context-management-context-restore.md +179 -0
- package/merged-commands/context-management-context-save.md +177 -0
- package/merged-commands/context-manager.md +185 -0
- package/merged-commands/context-optimization.md +186 -0
- package/merged-commands/context-window-management.md +53 -0
- package/merged-commands/context7-auto-research.md +36 -0
- package/merged-commands/conversation-memory.md +61 -0
- package/merged-commands/copy-editing.md +439 -0
- package/merged-commands/copywriting.md +225 -0
- package/merged-commands/core-components.md +264 -0
- package/merged-commands/cosmos-db-python-skill.md +198 -0
- package/merged-commands/cost-optimization.md +286 -0
- package/merged-commands/cpp-pro.md +59 -0
- package/merged-commands/cqrs-implementation.md +35 -0
- package/merged-commands/create-pr.md +192 -0
- package/merged-commands/crewai.md +243 -0
- package/merged-commands/csharp-developer.md +94 -0
- package/merged-commands/csharp-pro.md +59 -0
- package/merged-commands/culture-index.md +43 -0
- package/merged-commands/customer-support.md +170 -0
- package/merged-commands/daily-news-report.md +356 -0
- package/merged-commands/data-engineer.md +224 -0
- package/merged-commands/data-engineering-data-driven-feature.md +182 -0
- package/merged-commands/data-engineering-data-pipeline.md +201 -0
- package/merged-commands/data-quality-frameworks.md +40 -0
- package/merged-commands/data-scientist.md +199 -0
- package/merged-commands/data-storytelling.md +465 -0
- package/merged-commands/database-admin.md +165 -0
- package/merged-commands/database-architect.md +268 -0
- package/merged-commands/database-cloud-optimization-cost-optimize.md +44 -0
- package/merged-commands/database-design.md +52 -0
- package/merged-commands/database-migration.md +436 -0
- package/merged-commands/database-migrations-migration-observability.md +420 -0
- package/merged-commands/database-migrations-sql-migrations.md +53 -0
- package/merged-commands/database-optimizer.md +167 -0
- package/merged-commands/databases.md +232 -0
- package/merged-commands/dbt-transformation-patterns.md +34 -0
- package/merged-commands/debugger.md +49 -0
- package/merged-commands/debugging-strategies.md +34 -0
- package/merged-commands/debugging-toolkit-smart-debug.md +197 -0
- package/merged-commands/debugging-wizard.md +93 -0
- package/merged-commands/debugging.md +84 -0
- package/merged-commands/deep-research.md +114 -0
- package/merged-commands/defi-protocol-templates.md +466 -0
- package/merged-commands/dependency-management-deps-audit.md +44 -0
- package/merged-commands/dependency-upgrade.md +421 -0
- package/merged-commands/deployment-engineer.md +170 -0
- package/merged-commands/deployment-pipeline-design.md +371 -0
- package/merged-commands/deployment-procedures.md +241 -0
- package/merged-commands/deployment-validation-config-validate.md +496 -0
- package/merged-commands/design-md.md +178 -0
- package/merged-commands/design-orchestration.md +167 -0
- package/merged-commands/developer-growth-analysis.md +322 -0
- package/merged-commands/devops-engineer.md +92 -0
- package/merged-commands/devops-troubleshooter.md +161 -0
- package/merged-commands/devops.md +285 -0
- package/merged-commands/discord-bot-architect.md +277 -0
- package/merged-commands/dispatching-parallel-agents.md +180 -0
- package/merged-commands/distributed-debugging-debug-trace.md +44 -0
- package/merged-commands/distributed-tracing.md +450 -0
- package/merged-commands/django-expert.md +89 -0
- package/merged-commands/django-pro.md +180 -0
- package/merged-commands/doc-coauthoring.md +375 -0
- package/merged-commands/docker-expert.md +409 -0
- package/merged-commands/docs-architect.md +98 -0
- package/merged-commands/docs-seeker.md +102 -0
- package/merged-commands/documentation-generation-doc-generate.md +48 -0
- package/merged-commands/documentation-templates.md +194 -0
- package/merged-commands/docx-official.md +197 -0
- package/merged-commands/docx.md +197 -0
- package/merged-commands/domain-name-brainstormer.md +212 -0
- package/merged-commands/dotnet-architect.md +197 -0
- package/merged-commands/dotnet-backend-patterns.md +37 -0
- package/merged-commands/dotnet-core-expert.md +96 -0
- package/merged-commands/dx-optimizer.md +83 -0
- package/merged-commands/e2e-testing-patterns.md +41 -0
- package/merged-commands/elixir-pro.md +59 -0
- package/merged-commands/email-sequence.md +925 -0
- package/merged-commands/email-systems.md +54 -0
- package/merged-commands/embedded-systems.md +98 -0
- package/merged-commands/embedding-strategies.md +491 -0
- package/merged-commands/employment-contract-templates.md +39 -0
- package/merged-commands/environment-setup-guide.md +479 -0
- package/merged-commands/error-debugging-error-analysis.md +47 -0
- package/merged-commands/error-debugging-error-trace.md +43 -0
- package/merged-commands/error-debugging-multi-agent-review.md +216 -0
- package/merged-commands/error-detective.md +53 -0
- package/merged-commands/error-diagnostics-error-analysis.md +47 -0
- package/merged-commands/error-diagnostics-error-trace.md +48 -0
- package/merged-commands/error-diagnostics-smart-debug.md +197 -0
- package/merged-commands/error-handling-patterns.md +35 -0
- package/merged-commands/ethical-hacking-methodology.md +466 -0
- package/merged-commands/evaluation.md +238 -0
- package/merged-commands/event-sourcing-architect.md +58 -0
- package/merged-commands/event-store-design.md +449 -0
- package/merged-commands/exa-search.md +36 -0
- package/merged-commands/executing-plans.md +76 -0
- package/merged-commands/expo-app-design.md +22 -0
- package/merged-commands/expo-deployment.md +72 -0
- package/merged-commands/fal-audio.md +22 -0
- package/merged-commands/fal-generate.md +22 -0
- package/merged-commands/fal-image-edit.md +22 -0
- package/merged-commands/fal-platform.md +22 -0
- package/merged-commands/fal-upscale.md +22 -0
- package/merged-commands/fal-workflow.md +22 -0
- package/merged-commands/fastapi-expert.md +93 -0
- package/merged-commands/fastapi-pro.md +192 -0
- package/merged-commands/fastapi-router.md +52 -0
- package/merged-commands/fastapi-templates.md +32 -0
- package/merged-commands/feature-forge.md +90 -0
- package/merged-commands/ffuf-claude-skill.md +22 -0
- package/merged-commands/file-organizer.md +250 -0
- package/merged-commands/file-path-traversal.md +486 -0
- package/merged-commands/file-uploads.md +22 -0
- package/merged-commands/find-bugs.md +86 -0
- package/merged-commands/fine-tuning-expert.md +98 -0
- package/merged-commands/finishing-a-development-branch.md +200 -0
- package/merged-commands/firebase.md +56 -0
- package/merged-commands/firecrawl-scraper.md +37 -0
- package/merged-commands/firmware-analyst.md +320 -0
- package/merged-commands/fix-review.md +53 -0
- package/merged-commands/fixing.md +72 -0
- package/merged-commands/flutter-expert.md +200 -0
- package/merged-commands/form-cro.md +441 -0
- package/merged-commands/foundry-iq-agent.md +15 -0
- package/merged-commands/foundry-iq-python.md +275 -0
- package/merged-commands/foundry-nextgen-frontend.md +555 -0
- package/merged-commands/foundry-sdk-python.md +290 -0
- package/merged-commands/fp-ts-errors.md +856 -0
- package/merged-commands/fp-ts-pragmatic.md +598 -0
- package/merged-commands/fp-ts-react.md +796 -0
- package/merged-commands/framework-migration-code-migrate.md +48 -0
- package/merged-commands/framework-migration-deps-upgrade.md +48 -0
- package/merged-commands/framework-migration-legacy-modernize.md +132 -0
- package/merged-commands/free-tool-strategy.md +576 -0
- package/merged-commands/frontend-design.md +272 -0
- package/merged-commands/frontend-dev-guidelines.md +359 -0
- package/merged-commands/frontend-developer.md +171 -0
- package/merged-commands/frontend-development.md +399 -0
- package/merged-commands/frontend-mobile-development-component-scaffold.md +403 -0
- package/merged-commands/frontend-mobile-security-xss-scan.md +322 -0
- package/merged-commands/frontend-security-coder.md +170 -0
- package/merged-commands/frontend-slides.md +770 -0
- package/merged-commands/full-stack-orchestration-full-stack-feature.md +135 -0
- package/merged-commands/fullstack-guardian.md +99 -0
- package/merged-commands/game-developer.md +94 -0
- package/merged-commands/game-development.md +167 -0
- package/merged-commands/gcp-cloud-run.md +288 -0
- package/merged-commands/gdpr-data-handling.md +33 -0
- package/merged-commands/geo-fundamentals.md +156 -0
- package/merged-commands/git-advanced-workflows.md +412 -0
- package/merged-commands/git-pr-workflows-git-workflow.md +140 -0
- package/merged-commands/git-pr-workflows-onboard.md +416 -0
- package/merged-commands/git-pr-workflows-pr-enhance.md +48 -0
- package/merged-commands/git-pushing.md +33 -0
- package/merged-commands/github-actions-templates.md +345 -0
- package/merged-commands/github-workflow-automation.md +846 -0
- package/merged-commands/gitlab-ci-patterns.md +283 -0
- package/merged-commands/gitops-workflow.md +303 -0
- package/merged-commands/go-concurrency-patterns.md +33 -0
- package/merged-commands/godot-gdscript-patterns.md +33 -0
- package/merged-commands/golang-pro.md +179 -0
- package/merged-commands/google-adk-python.md +243 -0
- package/merged-commands/grafana-dashboards.md +381 -0
- package/merged-commands/graphql-architect.md +182 -0
- package/merged-commands/graphql.md +68 -0
- package/merged-commands/haskell-pro.md +56 -0
- package/merged-commands/helm-chart-scaffolding.md +34 -0
- package/merged-commands/hr-pro.md +126 -0
- package/merged-commands/html-injection-testing.md +498 -0
- package/merged-commands/hubspot-integration.md +42 -0
- package/merged-commands/hugging-face-cli.md +198 -0
- package/merged-commands/hugging-face-jobs.md +1038 -0
- package/merged-commands/hybrid-cloud-architect.md +168 -0
- package/merged-commands/hybrid-cloud-networking.md +238 -0
- package/merged-commands/hybrid-search-implementation.md +32 -0
- package/merged-commands/i18n-localization.md +154 -0
- package/merged-commands/idor-testing.md +442 -0
- package/merged-commands/image-enhancer.md +99 -0
- package/merged-commands/imagen.md +77 -0
- package/merged-commands/incident-responder.md +213 -0
- package/merged-commands/incident-response-incident-response.md +168 -0
- package/merged-commands/incident-response-smart-fix.md +29 -0
- package/merged-commands/incident-runbook-templates.md +395 -0
- package/merged-commands/infinite-gratitude.md +26 -0
- package/merged-commands/inngest.md +55 -0
- package/merged-commands/interactive-portfolio.md +223 -0
- package/merged-commands/internal-comms-anthropic.md +32 -0
- package/merged-commands/internal-comms-community.md +32 -0
- package/merged-commands/internal-comms.md +32 -0
- package/merged-commands/invoice-organizer.md +446 -0
- package/merged-commands/ios-developer.md +219 -0
- package/merged-commands/issue-creator.md +137 -0
- package/merged-commands/istio-traffic-management.md +337 -0
- package/merged-commands/iterate-pr.md +150 -0
- package/merged-commands/java-architect.md +95 -0
- package/merged-commands/java-pro.md +177 -0
- package/merged-commands/javascript-mastery.md +645 -0
- package/merged-commands/javascript-pro.md +57 -0
- package/merged-commands/javascript-testing-patterns.md +35 -0
- package/merged-commands/javascript-typescript-typescript-scaffold.md +361 -0
- package/merged-commands/javascript-typescript.md +142 -0
- package/merged-commands/jira-issues.md +181 -0
- package/merged-commands/job-application.md +90 -0
- package/merged-commands/julia-pro.md +209 -0
- package/merged-commands/k8s-manifest-generator.md +35 -0
- package/merged-commands/k8s-security-policies.md +346 -0
- package/merged-commands/kaizen.md +730 -0
- package/merged-commands/kotlin-specialist.md +94 -0
- package/merged-commands/kpi-dashboard-design.md +440 -0
- package/merged-commands/kubernetes-architect.md +170 -0
- package/merged-commands/kubernetes-specialist.md +117 -0
- package/merged-commands/langchain-architecture.md +350 -0
- package/merged-commands/langfuse.md +238 -0
- package/merged-commands/langgraph.md +287 -0
- package/merged-commands/laravel-specialist.md +101 -0
- package/merged-commands/last30days.md +421 -0
- package/merged-commands/launch-strategy.md +344 -0
- package/merged-commands/lead-research-assistant.md +199 -0
- package/merged-commands/learn.md +476 -0
- package/merged-commands/legacy-modernizer.md +53 -0
- package/merged-commands/legal-advisor.md +70 -0
- package/merged-commands/linear-claude-skill.md +543 -0
- package/merged-commands/linkerd-patterns.md +321 -0
- package/merged-commands/lint-and-validate.md +45 -0
- package/merged-commands/linux-privilege-escalation.md +504 -0
- package/merged-commands/linux-shell-scripting.md +504 -0
- package/merged-commands/llm-app-patterns.md +760 -0
- package/merged-commands/llm-application-dev-ai-assistant.md +35 -0
- package/merged-commands/llm-application-dev-langchain-agent.md +246 -0
- package/merged-commands/llm-application-dev-prompt-optimize.md +37 -0
- package/merged-commands/llm-application-dev.md +216 -0
- package/merged-commands/llm-evaluation.md +483 -0
- package/merged-commands/loki-mode.md +721 -0
- package/merged-commands/machine-learning-ops-ml-pipeline.md +314 -0
- package/merged-commands/makepad-skills.md +22 -0
- package/merged-commands/malware-analyst.md +247 -0
- package/merged-commands/markdown-novel-viewer.md +281 -0
- package/merged-commands/market-sizing-analysis.md +425 -0
- package/merged-commands/marketing-ideas.md +221 -0
- package/merged-commands/marketing-psychology.md +255 -0
- package/merged-commands/mcp-builder.md +236 -0
- package/merged-commands/mcp-developer.md +94 -0
- package/merged-commands/mcp-management.md +209 -0
- package/merged-commands/media-processing.md +358 -0
- package/merged-commands/meeting-insights-analyzer.md +327 -0
- package/merged-commands/memory-forensics.md +491 -0
- package/merged-commands/memory-safety-patterns.md +33 -0
- package/merged-commands/memory-systems.md +228 -0
- package/merged-commands/mermaid-expert.md +59 -0
- package/merged-commands/mermaidjs-v11.md +115 -0
- package/merged-commands/metasploit-framework.md +478 -0
- package/merged-commands/micro-saas-launcher.md +212 -0
- package/merged-commands/microservices-architect.md +102 -0
- package/merged-commands/microservices-patterns.md +35 -0
- package/merged-commands/minecraft-bukkit-pro.md +126 -0
- package/merged-commands/ml-engineer.md +168 -0
- package/merged-commands/ml-pipeline-workflow.md +257 -0
- package/merged-commands/ml-pipeline.md +111 -0
- package/merged-commands/mlops-engineer.md +219 -0
- package/merged-commands/mobile-design.md +284 -0
- package/merged-commands/mobile-developer.md +205 -0
- package/merged-commands/mobile-development.md +212 -0
- package/merged-commands/mobile-security-coder.md +184 -0
- package/merged-commands/modern-javascript-patterns.md +35 -0
- package/merged-commands/monitoring-expert.md +92 -0
- package/merged-commands/monorepo-architect.md +61 -0
- package/merged-commands/monorepo-management.md +35 -0
- package/merged-commands/moodle-external-api-development.md +597 -0
- package/merged-commands/mtls-configuration.md +359 -0
- package/merged-commands/multi-agent-brainstorming.md +256 -0
- package/merged-commands/multi-agent-patterns.md +262 -0
- package/merged-commands/multi-cloud-architecture.md +189 -0
- package/merged-commands/multi-platform-apps-multi-platform.md +203 -0
- package/merged-commands/n8n-code-python.md +750 -0
- package/merged-commands/n8n-mcp-tools-expert.md +654 -0
- package/merged-commands/n8n-node-configuration.md +796 -0
- package/merged-commands/nanobanana-ppt-skills.md +22 -0
- package/merged-commands/neon-postgres.md +56 -0
- package/merged-commands/nestjs-expert.md +552 -0
- package/merged-commands/network-101.md +342 -0
- package/merged-commands/network-engineer.md +169 -0
- package/merged-commands/nextjs-app-router-patterns.md +33 -0
- package/merged-commands/nextjs-best-practices.md +203 -0
- package/merged-commands/nextjs-developer.md +97 -0
- package/merged-commands/nextjs-supabase-auth.md +56 -0
- package/merged-commands/nft-standards.md +395 -0
- package/merged-commands/nodejs-backend-patterns.md +35 -0
- package/merged-commands/nodejs-best-practices.md +333 -0
- package/merged-commands/nosql-expert.md +111 -0
- package/merged-commands/notebooklm-skill.md +269 -0
- package/merged-commands/notebooklm.md +269 -0
- package/merged-commands/notion-template-business.md +216 -0
- package/merged-commands/nx-workspace-patterns.md +464 -0
- package/merged-commands/observability-engineer.md +237 -0
- package/merged-commands/observability-monitoring-monitor-setup.md +48 -0
- package/merged-commands/observability-monitoring-slo-implement.md +43 -0
- package/merged-commands/observe-whatsapp.md +109 -0
- package/merged-commands/obsidian-clipper-template-creator.md +64 -0
- package/merged-commands/on-call-handoff-patterns.md +453 -0
- package/merged-commands/onboarding-cro.md +433 -0
- package/merged-commands/openapi-spec-generation.md +33 -0
- package/merged-commands/page-cro.md +343 -0
- package/merged-commands/paid-ads.md +551 -0
- package/merged-commands/pandas-pro.md +96 -0
- package/merged-commands/parallel-agents.md +175 -0
- package/merged-commands/payment-integration.md +77 -0
- package/merged-commands/paypal-integration.md +479 -0
- package/merged-commands/paywall-upgrade-cro.md +570 -0
- package/merged-commands/pci-compliance.md +478 -0
- package/merged-commands/pdf-official.md +294 -0
- package/merged-commands/pdf.md +294 -0
- package/merged-commands/pentest-checklist.md +334 -0
- package/merged-commands/pentest-commands.md +438 -0
- package/merged-commands/performance-engineer.md +180 -0
- package/merged-commands/performance-profiling.md +143 -0
- package/merged-commands/performance-testing-review-ai-review.md +450 -0
- package/merged-commands/performance-testing-review-multi-agent-review.md +216 -0
- package/merged-commands/personal-tool-builder.md +289 -0
- package/merged-commands/php-pro.md +63 -0
- package/merged-commands/plaid-fintech.md +50 -0
- package/merged-commands/plan-writing.md +152 -0
- package/merged-commands/planning-with-files.md +211 -0
- package/merged-commands/planning.md +95 -0
- package/merged-commands/plans-kanban.md +166 -0
- package/merged-commands/playwright-expert.md +87 -0
- package/merged-commands/playwright-skill.md +453 -0
- package/merged-commands/podcast-generation.md +121 -0
- package/merged-commands/popup-cro.md +346 -0
- package/merged-commands/posix-shell-pro.md +304 -0
- package/merged-commands/postgres-best-practices.md +57 -0
- package/merged-commands/postgres-pro.md +98 -0
- package/merged-commands/postgresql.md +230 -0
- package/merged-commands/postmortem-writing.md +386 -0
- package/merged-commands/powershell-windows.md +167 -0
- package/merged-commands/pptx-official.md +484 -0
- package/merged-commands/pptx.md +484 -0
- package/merged-commands/pricing-strategy.md +356 -0
- package/merged-commands/prisma-expert.md +355 -0
- package/merged-commands/privilege-escalation-methods.md +333 -0
- package/merged-commands/problem-solving.md +96 -0
- package/merged-commands/product-manager-toolkit.md +351 -0
- package/merged-commands/product-strategist.md +26 -0
- package/merged-commands/production-code-audit.md +540 -0
- package/merged-commands/programmatic-seo.md +351 -0
- package/merged-commands/projection-patterns.md +33 -0
- package/merged-commands/prometheus-configuration.md +404 -0
- package/merged-commands/prompt-caching.md +61 -0
- package/merged-commands/prompt-engineer.md +272 -0
- package/merged-commands/prompt-engineering-patterns.md +213 -0
- package/merged-commands/prompt-engineering.md +171 -0
- package/merged-commands/prompt-library.md +322 -0
- package/merged-commands/protocol-reverse-engineering.md +29 -0
- package/merged-commands/pydantic-models.md +58 -0
- package/merged-commands/pypict-skill.md +22 -0
- package/merged-commands/python-development-python-scaffold.md +331 -0
- package/merged-commands/python-development.md +139 -0
- package/merged-commands/python-packaging.md +36 -0
- package/merged-commands/python-patterns.md +441 -0
- package/merged-commands/python-performance-optimization.md +36 -0
- package/merged-commands/python-pro.md +158 -0
- package/merged-commands/python-testing-patterns.md +37 -0
- package/merged-commands/qa-regression.md +337 -0
- package/merged-commands/quant-analyst.md +53 -0
- package/merged-commands/radix-ui-design-system.md +847 -0
- package/merged-commands/raffle-winner-picker.md +159 -0
- package/merged-commands/rag-architect.md +100 -0
- package/merged-commands/rag-engineer.md +90 -0
- package/merged-commands/rag-implementation.md +421 -0
- package/merged-commands/rails-expert.md +97 -0
- package/merged-commands/react-best-practices.md +121 -0
- package/merged-commands/react-expert.md +98 -0
- package/merged-commands/react-flow-node.md +66 -0
- package/merged-commands/react-modernization.md +34 -0
- package/merged-commands/react-native-architecture.md +33 -0
- package/merged-commands/react-native-expert.md +88 -0
- package/merged-commands/react-patterns.md +198 -0
- package/merged-commands/react-state-management.md +441 -0
- package/merged-commands/react-ui-patterns.md +289 -0
- package/merged-commands/readme.md +775 -0
- package/merged-commands/receiving-code-review.md +213 -0
- package/merged-commands/red-team-tactics.md +199 -0
- package/merged-commands/red-team-tools.md +310 -0
- package/merged-commands/reference-builder.md +188 -0
- package/merged-commands/referral-program.md +602 -0
- package/merged-commands/remotion-best-practices.md +45 -0
- package/merged-commands/repomix.md +275 -0
- package/merged-commands/requesting-code-review.md +105 -0
- package/merged-commands/research-engineer.md +135 -0
- package/merged-commands/research.md +191 -0
- package/merged-commands/reverse-engineer.md +173 -0
- package/merged-commands/risk-manager.md +61 -0
- package/merged-commands/risk-metrics-calculation.md +33 -0
- package/merged-commands/ruby-pro.md +56 -0
- package/merged-commands/rust-async-patterns.md +33 -0
- package/merged-commands/rust-engineer.md +96 -0
- package/merged-commands/rust-pro.md +178 -0
- package/merged-commands/saga-orchestration.md +496 -0
- package/merged-commands/sales-automator.md +55 -0
- package/merged-commands/salesforce-developer.md +105 -0
- package/merged-commands/salesforce-development.md +51 -0
- package/merged-commands/sast-configuration.md +212 -0
- package/merged-commands/scala-pro.md +82 -0
- package/merged-commands/scanning-tools.md +589 -0
- package/merged-commands/schema-markup.md +360 -0
- package/merged-commands/screen-reader-testing.md +33 -0
- package/merged-commands/screenshots.md +401 -0
- package/merged-commands/scroll-experience.md +263 -0
- package/merged-commands/search-specialist.md +80 -0
- package/merged-commands/secrets-management.md +364 -0
- package/merged-commands/secure-code-guardian.md +93 -0
- package/merged-commands/security-auditor.md +169 -0
- package/merged-commands/security-bluebook-builder.md +22 -0
- package/merged-commands/security-compliance-compliance-check.md +55 -0
- package/merged-commands/security-requirement-extraction.md +33 -0
- package/merged-commands/security-reviewer.md +94 -0
- package/merged-commands/security-scanning-security-dependencies.md +43 -0
- package/merged-commands/security-scanning-security-hardening.md +147 -0
- package/merged-commands/security-scanning-security-sast.md +495 -0
- package/merged-commands/segment-cdp.md +50 -0
- package/merged-commands/senior-architect.md +209 -0
- package/merged-commands/senior-backend.md +209 -0
- package/merged-commands/senior-computer-vision.md +226 -0
- package/merged-commands/senior-data-engineer.md +226 -0
- package/merged-commands/senior-data-scientist.md +226 -0
- package/merged-commands/senior-devops.md +209 -0
- package/merged-commands/senior-frontend.md +209 -0
- package/merged-commands/senior-fullstack.md +209 -0
- package/merged-commands/senior-ml-engineer.md +226 -0
- package/merged-commands/senior-prompt-engineer.md +226 -0
- package/merged-commands/senior-qa.md +209 -0
- package/merged-commands/senior-secops.md +209 -0
- package/merged-commands/senior-security.md +209 -0
- package/merged-commands/seo-audit.md +487 -0
- package/merged-commands/seo-authority-builder.md +136 -0
- package/merged-commands/seo-cannibalization-detector.md +123 -0
- package/merged-commands/seo-content-auditor.md +83 -0
- package/merged-commands/seo-content-planner.md +108 -0
- package/merged-commands/seo-content-refresher.md +118 -0
- package/merged-commands/seo-content-writer.md +96 -0
- package/merged-commands/seo-fundamentals.md +173 -0
- package/merged-commands/seo-keyword-strategist.md +95 -0
- package/merged-commands/seo-meta-optimizer.md +92 -0
- package/merged-commands/seo-snippet-hunter.md +114 -0
- package/merged-commands/seo-structure-architect.md +108 -0
- package/merged-commands/sequential-thinking.md +94 -0
- package/merged-commands/server-management.md +161 -0
- package/merged-commands/service-mesh-expert.md +58 -0
- package/merged-commands/service-mesh-observability.md +395 -0
- package/merged-commands/sharp-edges.md +70 -0
- package/merged-commands/shellcheck-configuration.md +466 -0
- package/merged-commands/shodan-reconnaissance.md +503 -0
- package/merged-commands/shopify-apps.md +42 -0
- package/merged-commands/shopify-development.md +366 -0
- package/merged-commands/shopify-expert.md +102 -0
- package/merged-commands/signup-flow-cro.md +355 -0
- package/merged-commands/similarity-search-patterns.md +33 -0
- package/merged-commands/skill-creator.md +356 -0
- package/merged-commands/skill-developer.md +426 -0
- package/merged-commands/skill-rails-upgrade.md +408 -0
- package/merged-commands/skill-seekers.md +22 -0
- package/merged-commands/skill-share.md +80 -0
- package/merged-commands/slack-bot-builder.md +264 -0
- package/merged-commands/slack-gif-creator.md +254 -0
- package/merged-commands/slo-implementation.md +341 -0
- package/merged-commands/smtp-penetration-testing.md +500 -0
- package/merged-commands/social-content.md +807 -0
- package/merged-commands/software-architecture.md +75 -0
- package/merged-commands/solidity-security.md +34 -0
- package/merged-commands/spark-engineer.md +100 -0
- package/merged-commands/spark-optimization.md +427 -0
- package/merged-commands/spec-miner.md +88 -0
- package/merged-commands/spring-boot-engineer.md +104 -0
- package/merged-commands/sql-injection-testing.md +448 -0
- package/merged-commands/sql-optimization-patterns.md +35 -0
- package/merged-commands/sql-pro.md +173 -0
- package/merged-commands/sqlmap-database-pentesting.md +400 -0
- package/merged-commands/sre-engineer.md +98 -0
- package/merged-commands/ssh-penetration-testing.md +488 -0
- package/merged-commands/startup-analyst.md +328 -0
- package/merged-commands/startup-business-analyst-business-case.md +487 -0
- package/merged-commands/startup-business-analyst-financial-projections.md +353 -0
- package/merged-commands/startup-business-analyst-market-opportunity.md +240 -0
- package/merged-commands/startup-financial-modeling.md +467 -0
- package/merged-commands/startup-metrics-framework.md +34 -0
- package/merged-commands/stitch-ui-design.md +378 -0
- package/merged-commands/stride-analysis-patterns.md +33 -0
- package/merged-commands/stripe-integration.md +454 -0
- package/merged-commands/subagent-driven-development.md +240 -0
- package/merged-commands/superpowers-lab.md +22 -0
- package/merged-commands/swift-expert.md +94 -0
- package/merged-commands/swiftui-expert-skill.md +275 -0
- package/merged-commands/systematic-debugging.md +296 -0
- package/merged-commands/systems-programming-rust-project.md +440 -0
- package/merged-commands/tailwind-design-system.md +33 -0
- package/merged-commands/tailwind-patterns.md +269 -0
- package/merged-commands/tavily-web.md +36 -0
- package/merged-commands/tdd-orchestrator.md +205 -0
- package/merged-commands/tdd-workflow.md +149 -0
- package/merged-commands/tdd-workflows-tdd-cycle.md +221 -0
- package/merged-commands/tdd-workflows-tdd-green.md +73 -0
- package/merged-commands/tdd-workflows-tdd-red.md +164 -0
- package/merged-commands/tdd-workflows-tdd-refactor.md +187 -0
- package/merged-commands/team-collaboration-issue.md +37 -0
- package/merged-commands/team-collaboration-standup-notes.md +44 -0
- package/merged-commands/team-composition-analysis.md +413 -0
- package/merged-commands/telegram-bot-builder.md +254 -0
- package/merged-commands/telegram-mini-app.md +279 -0
- package/merged-commands/template-skill.md +6 -0
- package/merged-commands/temporal-python-pro.md +370 -0
- package/merged-commands/temporal-python-testing.md +170 -0
- package/merged-commands/terraform-engineer.md +97 -0
- package/merged-commands/terraform-module-library.md +261 -0
- package/merged-commands/terraform-skill.md +517 -0
- package/merged-commands/terraform-specialist.md +166 -0
- package/merged-commands/test-automator.md +224 -0
- package/merged-commands/test-driven-development.md +371 -0
- package/merged-commands/test-fixing.md +119 -0
- package/merged-commands/test-master.md +104 -0
- package/merged-commands/testing-patterns.md +259 -0
- package/merged-commands/theme-factory.md +59 -0
- package/merged-commands/threat-mitigation-mapping.md +33 -0
- package/merged-commands/threat-modeling-expert.md +60 -0
- package/merged-commands/threejs-skills.md +22 -0
- package/merged-commands/threejs.md +89 -0
- package/merged-commands/tool-design.md +318 -0
- package/merged-commands/top-web-vulnerabilities.md +543 -0
- package/merged-commands/track-management.md +38 -0
- package/merged-commands/trigger-dev.md +67 -0
- package/merged-commands/turborepo-caching.md +419 -0
- package/merged-commands/tutorial-engineer.md +139 -0
- package/merged-commands/twilio-communications.md +295 -0
- package/merged-commands/typescript-advanced-types.md +35 -0
- package/merged-commands/typescript-expert.md +429 -0
- package/merged-commands/typescript-pro.md +55 -0
- package/merged-commands/ui-design-system.md +32 -0
- package/merged-commands/ui-skills.md +22 -0
- package/merged-commands/ui-styling.md +321 -0
- package/merged-commands/ui-ux-designer.md +209 -0
- package/merged-commands/ui-ux-pro-max.md +351 -0
- package/merged-commands/ui-visual-validator.md +214 -0
- package/merged-commands/unit-testing-test-generate.md +319 -0
- package/merged-commands/unity-developer.md +230 -0
- package/merged-commands/unity-ecs-patterns.md +33 -0
- package/merged-commands/unreal-engine-cpp-pro.md +114 -0
- package/merged-commands/upgrading-expo.md +118 -0
- package/merged-commands/upstash-qstash.md +68 -0
- package/merged-commands/using-git-worktrees.md +217 -0
- package/merged-commands/using-neon.md +84 -0
- package/merged-commands/using-superpowers.md +87 -0
- package/merged-commands/uv-package-manager.md +37 -0
- package/merged-commands/ux-researcher-designer.md +30 -0
- package/merged-commands/varlock-claude-skill.md +22 -0
- package/merged-commands/vector-database-engineer.md +60 -0
- package/merged-commands/vector-index-tuning.md +42 -0
- package/merged-commands/vercel-deploy-claimable.md +120 -0
- package/merged-commands/vercel-deploy.md +22 -0
- package/merged-commands/vercel-deployment.md +79 -0
- package/merged-commands/verification-before-completion.md +139 -0
- package/merged-commands/vexor.md +22 -0
- package/merged-commands/video-downloader.md +106 -0
- package/merged-commands/viral-generator-builder.md +199 -0
- package/merged-commands/voice-agents.md +68 -0
- package/merged-commands/voice-ai-development.md +302 -0
- package/merged-commands/voice-ai-engine-development.md +721 -0
- package/merged-commands/vue-expert-js.md +91 -0
- package/merged-commands/vue-expert.md +374 -0
- package/merged-commands/vulnerability-scanner.md +276 -0
- package/merged-commands/wcag-audit-patterns.md +41 -0
- package/merged-commands/web-artifacts-builder.md +74 -0
- package/merged-commands/web-design-guidelines.md +36 -0
- package/merged-commands/web-frameworks.md +324 -0
- package/merged-commands/web-performance-optimization.md +646 -0
- package/merged-commands/web3-testing.md +427 -0
- package/merged-commands/webapp-testing.md +96 -0
- package/merged-commands/websocket-engineer.md +96 -0
- package/merged-commands/windows-privilege-escalation.md +496 -0
- package/merged-commands/wireshark-analysis.md +497 -0
- package/merged-commands/wordpress-penetration-testing.md +485 -0
- package/merged-commands/wordpress-pro.md +105 -0
- package/merged-commands/workflow-automation.md +68 -0
- package/merged-commands/workflow-orchestration-patterns.md +333 -0
- package/merged-commands/workflow-patterns.md +38 -0
- package/merged-commands/writing-plans.md +116 -0
- package/merged-commands/writing-skills.md +125 -0
- package/merged-commands/x-article-publisher-skill.md +22 -0
- package/merged-commands/xlsx-official.md +289 -0
- package/merged-commands/xlsx.md +289 -0
- package/merged-commands/xss-html-injection.md +499 -0
- package/merged-commands/youtube-transcript.md +415 -0
- package/merged-commands/zapier-make-patterns.md +67 -0
- package/merged-commands/zustand-store.md +68 -0
- package/package.json +1 -1
- package/scripts/merge-commands.js +21 -0
- package/templates/base/rules/auto-skill.md +131 -0
|
@@ -0,0 +1,598 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fp-ts-pragmatic
|
|
3
|
+
description: A practical, jargon-free guide to fp-ts functional programming - the 80/20 approach that gets results without the academic overhead. Use when writing TypeScript with fp-ts library.
|
|
4
|
+
risk: safe
|
|
5
|
+
source: https://github.com/whatiskadudoing/fp-ts-skills
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Pragmatic Functional Programming
|
|
9
|
+
|
|
10
|
+
**Read this first.** This guide cuts through the academic jargon and shows you what actually matters. No category theory. No abstract nonsense. Just patterns that make your code better.
|
|
11
|
+
|
|
12
|
+
## When to Use This Skill
|
|
13
|
+
|
|
14
|
+
- When starting with fp-ts and need practical guidance
|
|
15
|
+
- When writing TypeScript code that handles nullable values, errors, or async operations
|
|
16
|
+
- When you want cleaner, more maintainable functional code without the academic overhead
|
|
17
|
+
- When refactoring imperative code to functional style
|
|
18
|
+
|
|
19
|
+
## The Golden Rule
|
|
20
|
+
|
|
21
|
+
> **If functional programming makes your code harder to read, don't use it.**
|
|
22
|
+
|
|
23
|
+
FP is a tool, not a religion. Use it when it helps. Skip it when it doesn't.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## The 80/20 of FP
|
|
28
|
+
|
|
29
|
+
These five patterns give you most of the benefits. Master these before exploring anything else.
|
|
30
|
+
|
|
31
|
+
### 1. Pipe: Chain Operations Clearly
|
|
32
|
+
|
|
33
|
+
Instead of nesting function calls or creating intermediate variables, chain operations in reading order.
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
import { pipe } from 'fp-ts/function'
|
|
37
|
+
|
|
38
|
+
// Before: Hard to read (inside-out)
|
|
39
|
+
const result = format(validate(parse(input)))
|
|
40
|
+
|
|
41
|
+
// Before: Too many variables
|
|
42
|
+
const parsed = parse(input)
|
|
43
|
+
const validated = validate(parsed)
|
|
44
|
+
const result = format(validated)
|
|
45
|
+
|
|
46
|
+
// After: Clear, linear flow
|
|
47
|
+
const result = pipe(
|
|
48
|
+
input,
|
|
49
|
+
parse,
|
|
50
|
+
validate,
|
|
51
|
+
format
|
|
52
|
+
)
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**When to use pipe:**
|
|
56
|
+
- 3+ transformations on the same data
|
|
57
|
+
- You find yourself naming throwaway variables
|
|
58
|
+
- Logic reads better top-to-bottom
|
|
59
|
+
|
|
60
|
+
**When to skip pipe:**
|
|
61
|
+
- Just 1-2 operations (direct call is fine)
|
|
62
|
+
- The operations don't naturally chain
|
|
63
|
+
|
|
64
|
+
### 2. Option: Handle Missing Values Without null Checks
|
|
65
|
+
|
|
66
|
+
Stop writing `if (x !== null && x !== undefined)` everywhere.
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
import * as O from 'fp-ts/Option'
|
|
70
|
+
import { pipe } from 'fp-ts/function'
|
|
71
|
+
|
|
72
|
+
// Before: Defensive null checking
|
|
73
|
+
function getUserCity(user: User | null): string {
|
|
74
|
+
if (user === null) return 'Unknown'
|
|
75
|
+
if (user.address === null) return 'Unknown'
|
|
76
|
+
if (user.address.city === null) return 'Unknown'
|
|
77
|
+
return user.address.city
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// After: Chain through potential missing values
|
|
81
|
+
const getUserCity = (user: User | null): string =>
|
|
82
|
+
pipe(
|
|
83
|
+
O.fromNullable(user),
|
|
84
|
+
O.flatMap(u => O.fromNullable(u.address)),
|
|
85
|
+
O.flatMap(a => O.fromNullable(a.city)),
|
|
86
|
+
O.getOrElse(() => 'Unknown')
|
|
87
|
+
)
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**Plain language translation:**
|
|
91
|
+
- `O.fromNullable(x)` = "wrap this value, treating null/undefined as 'nothing'"
|
|
92
|
+
- `O.flatMap(fn)` = "if we have something, apply this function"
|
|
93
|
+
- `O.getOrElse(() => default)` = "unwrap, or use this default if nothing"
|
|
94
|
+
|
|
95
|
+
### 3. Either: Make Errors Explicit
|
|
96
|
+
|
|
97
|
+
Stop throwing exceptions for expected failures. Return errors as values.
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
import * as E from 'fp-ts/Either'
|
|
101
|
+
import { pipe } from 'fp-ts/function'
|
|
102
|
+
|
|
103
|
+
// Before: Hidden failure mode
|
|
104
|
+
function parseAge(input: string): number {
|
|
105
|
+
const age = parseInt(input, 10)
|
|
106
|
+
if (isNaN(age)) throw new Error('Invalid age')
|
|
107
|
+
if (age < 0) throw new Error('Age cannot be negative')
|
|
108
|
+
return age
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// After: Errors are visible in the type
|
|
112
|
+
function parseAge(input: string): E.Either<string, number> {
|
|
113
|
+
const age = parseInt(input, 10)
|
|
114
|
+
if (isNaN(age)) return E.left('Invalid age')
|
|
115
|
+
if (age < 0) return E.left('Age cannot be negative')
|
|
116
|
+
return E.right(age)
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Using it
|
|
120
|
+
const result = parseAge(userInput)
|
|
121
|
+
if (E.isRight(result)) {
|
|
122
|
+
console.log(`Age is ${result.right}`)
|
|
123
|
+
} else {
|
|
124
|
+
console.log(`Error: ${result.left}`)
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**Plain language translation:**
|
|
129
|
+
- `E.right(value)` = "success with this value"
|
|
130
|
+
- `E.left(error)` = "failure with this error"
|
|
131
|
+
- `E.isRight(x)` = "did it succeed?"
|
|
132
|
+
|
|
133
|
+
### 4. Map: Transform Without Unpacking
|
|
134
|
+
|
|
135
|
+
Transform values inside containers without extracting them first.
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
import * as O from 'fp-ts/Option'
|
|
139
|
+
import * as E from 'fp-ts/Either'
|
|
140
|
+
import * as A from 'fp-ts/Array'
|
|
141
|
+
import { pipe } from 'fp-ts/function'
|
|
142
|
+
|
|
143
|
+
// Transform inside Option
|
|
144
|
+
const maybeUser: O.Option<User> = O.some({ name: 'Alice', age: 30 })
|
|
145
|
+
const maybeName: O.Option<string> = pipe(
|
|
146
|
+
maybeUser,
|
|
147
|
+
O.map(user => user.name)
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
// Transform inside Either
|
|
151
|
+
const result: E.Either<Error, number> = E.right(5)
|
|
152
|
+
const doubled: E.Either<Error, number> = pipe(
|
|
153
|
+
result,
|
|
154
|
+
E.map(n => n * 2)
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
// Transform arrays (same concept!)
|
|
158
|
+
const numbers = [1, 2, 3]
|
|
159
|
+
const doubled = pipe(
|
|
160
|
+
numbers,
|
|
161
|
+
A.map(n => n * 2)
|
|
162
|
+
)
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### 5. FlatMap: Chain Operations That Might Fail
|
|
166
|
+
|
|
167
|
+
When each step might fail, chain them together.
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
import * as E from 'fp-ts/Either'
|
|
171
|
+
import { pipe } from 'fp-ts/function'
|
|
172
|
+
|
|
173
|
+
const parseJSON = (s: string): E.Either<string, unknown> =>
|
|
174
|
+
E.tryCatch(() => JSON.parse(s), () => 'Invalid JSON')
|
|
175
|
+
|
|
176
|
+
const extractEmail = (data: unknown): E.Either<string, string> => {
|
|
177
|
+
if (typeof data === 'object' && data !== null && 'email' in data) {
|
|
178
|
+
return E.right((data as { email: string }).email)
|
|
179
|
+
}
|
|
180
|
+
return E.left('No email field')
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const validateEmail = (email: string): E.Either<string, string> =>
|
|
184
|
+
email.includes('@') ? E.right(email) : E.left('Invalid email format')
|
|
185
|
+
|
|
186
|
+
// Chain all steps - if any fails, the whole thing fails
|
|
187
|
+
const getValidEmail = (input: string): E.Either<string, string> =>
|
|
188
|
+
pipe(
|
|
189
|
+
parseJSON(input),
|
|
190
|
+
E.flatMap(extractEmail),
|
|
191
|
+
E.flatMap(validateEmail)
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
// Success path: Right('user@example.com')
|
|
195
|
+
// Any failure: Left('specific error message')
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
**Plain language:** `flatMap` means "if this succeeded, try the next thing"
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## When NOT to Use FP
|
|
203
|
+
|
|
204
|
+
Functional programming is not always the answer. Here's when to keep it simple.
|
|
205
|
+
|
|
206
|
+
### Simple Null Checks
|
|
207
|
+
|
|
208
|
+
```typescript
|
|
209
|
+
// Just use optional chaining - it's built into the language
|
|
210
|
+
const city = user?.address?.city ?? 'Unknown'
|
|
211
|
+
|
|
212
|
+
// DON'T overcomplicate it
|
|
213
|
+
const city = pipe(
|
|
214
|
+
O.fromNullable(user),
|
|
215
|
+
O.flatMap(u => O.fromNullable(u.address)),
|
|
216
|
+
O.flatMap(a => O.fromNullable(a.city)),
|
|
217
|
+
O.getOrElse(() => 'Unknown')
|
|
218
|
+
)
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### Simple Loops
|
|
222
|
+
|
|
223
|
+
```typescript
|
|
224
|
+
// A for loop is fine when you need early exit or complex logic
|
|
225
|
+
function findFirst(items: Item[], predicate: (i: Item) => boolean): Item | null {
|
|
226
|
+
for (const item of items) {
|
|
227
|
+
if (predicate(item)) return item
|
|
228
|
+
}
|
|
229
|
+
return null
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// DON'T force FP when it doesn't help
|
|
233
|
+
const result = pipe(
|
|
234
|
+
items,
|
|
235
|
+
A.findFirst(predicate),
|
|
236
|
+
O.toNullable
|
|
237
|
+
)
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### Performance-Critical Code
|
|
241
|
+
|
|
242
|
+
```typescript
|
|
243
|
+
// For hot paths, imperative is faster (no intermediate arrays)
|
|
244
|
+
function sumLarge(numbers: number[]): number {
|
|
245
|
+
let sum = 0
|
|
246
|
+
for (let i = 0; i < numbers.length; i++) {
|
|
247
|
+
sum += numbers[i]
|
|
248
|
+
}
|
|
249
|
+
return sum
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// fp-ts creates intermediate structures
|
|
253
|
+
const sum = pipe(numbers, A.reduce(0, (acc, n) => acc + n))
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
### When Your Team Doesn't Know FP
|
|
257
|
+
|
|
258
|
+
If you're the only one who can read the code, it's not good code.
|
|
259
|
+
|
|
260
|
+
```typescript
|
|
261
|
+
// If your team knows this pattern
|
|
262
|
+
async function getUser(id: string): Promise<User | null> {
|
|
263
|
+
try {
|
|
264
|
+
const response = await fetch(`/api/users/${id}`)
|
|
265
|
+
if (!response.ok) return null
|
|
266
|
+
return await response.json()
|
|
267
|
+
} catch {
|
|
268
|
+
return null
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// Don't force this on them
|
|
273
|
+
const getUser = (id: string): TE.TaskEither<Error, User> =>
|
|
274
|
+
pipe(
|
|
275
|
+
TE.tryCatch(() => fetch(`/api/users/${id}`), E.toError),
|
|
276
|
+
TE.flatMap(r => r.ok ? TE.right(r) : TE.left(new Error('Not found'))),
|
|
277
|
+
TE.flatMap(r => TE.tryCatch(() => r.json(), E.toError))
|
|
278
|
+
)
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
## Quick Wins: Easy Changes That Improve Code Today
|
|
284
|
+
|
|
285
|
+
### 1. Replace Nested Ternaries with pipe + fold
|
|
286
|
+
|
|
287
|
+
```typescript
|
|
288
|
+
// Before: Nested ternary nightmare
|
|
289
|
+
const message = user === null
|
|
290
|
+
? 'No user'
|
|
291
|
+
: user.isAdmin
|
|
292
|
+
? `Admin: ${user.name}`
|
|
293
|
+
: `User: ${user.name}`
|
|
294
|
+
|
|
295
|
+
// After: Clear case handling
|
|
296
|
+
const message = pipe(
|
|
297
|
+
O.fromNullable(user),
|
|
298
|
+
O.fold(
|
|
299
|
+
() => 'No user',
|
|
300
|
+
(u) => u.isAdmin ? `Admin: ${u.name}` : `User: ${u.name}`
|
|
301
|
+
)
|
|
302
|
+
)
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### 2. Replace try-catch with tryCatch
|
|
306
|
+
|
|
307
|
+
```typescript
|
|
308
|
+
// Before: try-catch everywhere
|
|
309
|
+
let config
|
|
310
|
+
try {
|
|
311
|
+
config = JSON.parse(rawConfig)
|
|
312
|
+
} catch {
|
|
313
|
+
config = defaultConfig
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// After: One-liner
|
|
317
|
+
const config = pipe(
|
|
318
|
+
E.tryCatch(() => JSON.parse(rawConfig), () => 'parse error'),
|
|
319
|
+
E.getOrElse(() => defaultConfig)
|
|
320
|
+
)
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
### 3. Replace undefined Returns with Option
|
|
324
|
+
|
|
325
|
+
```typescript
|
|
326
|
+
// Before: Caller might forget to check
|
|
327
|
+
function findUser(id: string): User | undefined {
|
|
328
|
+
return users.find(u => u.id === id)
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// After: Type forces caller to handle missing case
|
|
332
|
+
function findUser(id: string): O.Option<User> {
|
|
333
|
+
return O.fromNullable(users.find(u => u.id === id))
|
|
334
|
+
}
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
### 4. Replace Error Strings with Typed Errors
|
|
338
|
+
|
|
339
|
+
```typescript
|
|
340
|
+
// Before: Just strings
|
|
341
|
+
function validate(data: unknown): E.Either<string, User> {
|
|
342
|
+
// ...
|
|
343
|
+
return E.left('validation failed')
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// After: Structured errors
|
|
347
|
+
type ValidationError = {
|
|
348
|
+
field: string
|
|
349
|
+
message: string
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
function validate(data: unknown): E.Either<ValidationError, User> {
|
|
353
|
+
// ...
|
|
354
|
+
return E.left({ field: 'email', message: 'Invalid format' })
|
|
355
|
+
}
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
### 5. Use const Assertions for Error Types
|
|
359
|
+
|
|
360
|
+
```typescript
|
|
361
|
+
// Create specific error types without classes
|
|
362
|
+
const NotFound = (id: string) => ({ _tag: 'NotFound' as const, id })
|
|
363
|
+
const Unauthorized = { _tag: 'Unauthorized' as const }
|
|
364
|
+
const ValidationFailed = (errors: string[]) =>
|
|
365
|
+
({ _tag: 'ValidationFailed' as const, errors })
|
|
366
|
+
|
|
367
|
+
type AppError =
|
|
368
|
+
| ReturnType<typeof NotFound>
|
|
369
|
+
| typeof Unauthorized
|
|
370
|
+
| ReturnType<typeof ValidationFailed>
|
|
371
|
+
|
|
372
|
+
// Now you can pattern match
|
|
373
|
+
const handleError = (error: AppError): string => {
|
|
374
|
+
switch (error._tag) {
|
|
375
|
+
case 'NotFound': return `Item ${error.id} not found`
|
|
376
|
+
case 'Unauthorized': return 'Please log in'
|
|
377
|
+
case 'ValidationFailed': return error.errors.join(', ')
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
## Common Refactors: Before and After
|
|
385
|
+
|
|
386
|
+
### Callback Hell to Pipe
|
|
387
|
+
|
|
388
|
+
```typescript
|
|
389
|
+
// Before
|
|
390
|
+
fetchUser(id, (user) => {
|
|
391
|
+
if (!user) return handleNoUser()
|
|
392
|
+
fetchPosts(user.id, (posts) => {
|
|
393
|
+
if (!posts) return handleNoPosts()
|
|
394
|
+
fetchComments(posts[0].id, (comments) => {
|
|
395
|
+
render(user, posts, comments)
|
|
396
|
+
})
|
|
397
|
+
})
|
|
398
|
+
})
|
|
399
|
+
|
|
400
|
+
// After (with TaskEither for async)
|
|
401
|
+
import * as TE from 'fp-ts/TaskEither'
|
|
402
|
+
|
|
403
|
+
const loadData = (id: string) =>
|
|
404
|
+
pipe(
|
|
405
|
+
fetchUser(id),
|
|
406
|
+
TE.flatMap(user => pipe(
|
|
407
|
+
fetchPosts(user.id),
|
|
408
|
+
TE.map(posts => ({ user, posts }))
|
|
409
|
+
)),
|
|
410
|
+
TE.flatMap(({ user, posts }) => pipe(
|
|
411
|
+
fetchComments(posts[0].id),
|
|
412
|
+
TE.map(comments => ({ user, posts, comments }))
|
|
413
|
+
))
|
|
414
|
+
)
|
|
415
|
+
|
|
416
|
+
// Execute
|
|
417
|
+
const result = await loadData('123')()
|
|
418
|
+
pipe(
|
|
419
|
+
result,
|
|
420
|
+
E.fold(handleError, ({ user, posts, comments }) => render(user, posts, comments))
|
|
421
|
+
)
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
### Multiple null Checks to Option Chain
|
|
425
|
+
|
|
426
|
+
```typescript
|
|
427
|
+
// Before
|
|
428
|
+
function getManagerEmail(employee: Employee): string | null {
|
|
429
|
+
if (!employee.department) return null
|
|
430
|
+
if (!employee.department.manager) return null
|
|
431
|
+
if (!employee.department.manager.email) return null
|
|
432
|
+
return employee.department.manager.email
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
// After
|
|
436
|
+
const getManagerEmail = (employee: Employee): O.Option<string> =>
|
|
437
|
+
pipe(
|
|
438
|
+
O.fromNullable(employee.department),
|
|
439
|
+
O.flatMap(d => O.fromNullable(d.manager)),
|
|
440
|
+
O.flatMap(m => O.fromNullable(m.email))
|
|
441
|
+
)
|
|
442
|
+
|
|
443
|
+
// Use it
|
|
444
|
+
pipe(
|
|
445
|
+
getManagerEmail(employee),
|
|
446
|
+
O.fold(
|
|
447
|
+
() => sendToDefault(),
|
|
448
|
+
(email) => sendTo(email)
|
|
449
|
+
)
|
|
450
|
+
)
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
### Validation with Multiple Checks
|
|
454
|
+
|
|
455
|
+
```typescript
|
|
456
|
+
// Before: Throws on first error
|
|
457
|
+
function validateUser(data: unknown): User {
|
|
458
|
+
if (!data || typeof data !== 'object') throw new Error('Must be object')
|
|
459
|
+
const obj = data as Record<string, unknown>
|
|
460
|
+
if (typeof obj.email !== 'string') throw new Error('Email required')
|
|
461
|
+
if (!obj.email.includes('@')) throw new Error('Invalid email')
|
|
462
|
+
if (typeof obj.age !== 'number') throw new Error('Age required')
|
|
463
|
+
if (obj.age < 0) throw new Error('Age must be positive')
|
|
464
|
+
return obj as User
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
// After: Returns first error, type-safe
|
|
468
|
+
const validateUser = (data: unknown): E.Either<string, User> =>
|
|
469
|
+
pipe(
|
|
470
|
+
E.Do,
|
|
471
|
+
E.bind('obj', () =>
|
|
472
|
+
typeof data === 'object' && data !== null
|
|
473
|
+
? E.right(data as Record<string, unknown>)
|
|
474
|
+
: E.left('Must be object')
|
|
475
|
+
),
|
|
476
|
+
E.bind('email', ({ obj }) =>
|
|
477
|
+
typeof obj.email === 'string' && obj.email.includes('@')
|
|
478
|
+
? E.right(obj.email)
|
|
479
|
+
: E.left('Valid email required')
|
|
480
|
+
),
|
|
481
|
+
E.bind('age', ({ obj }) =>
|
|
482
|
+
typeof obj.age === 'number' && obj.age >= 0
|
|
483
|
+
? E.right(obj.age)
|
|
484
|
+
: E.left('Valid age required')
|
|
485
|
+
),
|
|
486
|
+
E.map(({ email, age }) => ({ email, age }))
|
|
487
|
+
)
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
### Promise Chain to TaskEither
|
|
491
|
+
|
|
492
|
+
```typescript
|
|
493
|
+
// Before
|
|
494
|
+
async function processOrder(orderId: string): Promise<Receipt> {
|
|
495
|
+
const order = await fetchOrder(orderId)
|
|
496
|
+
if (!order) throw new Error('Order not found')
|
|
497
|
+
|
|
498
|
+
const validated = await validateOrder(order)
|
|
499
|
+
if (!validated.success) throw new Error(validated.error)
|
|
500
|
+
|
|
501
|
+
const payment = await processPayment(validated.order)
|
|
502
|
+
if (!payment.success) throw new Error('Payment failed')
|
|
503
|
+
|
|
504
|
+
return generateReceipt(payment)
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
// After
|
|
508
|
+
const processOrder = (orderId: string): TE.TaskEither<string, Receipt> =>
|
|
509
|
+
pipe(
|
|
510
|
+
fetchOrderTE(orderId),
|
|
511
|
+
TE.flatMap(order =>
|
|
512
|
+
order ? TE.right(order) : TE.left('Order not found')
|
|
513
|
+
),
|
|
514
|
+
TE.flatMap(validateOrderTE),
|
|
515
|
+
TE.flatMap(processPaymentTE),
|
|
516
|
+
TE.map(generateReceipt)
|
|
517
|
+
)
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
---
|
|
521
|
+
|
|
522
|
+
## The Readability Rule
|
|
523
|
+
|
|
524
|
+
Before using any FP pattern, ask: **"Would a junior developer understand this?"**
|
|
525
|
+
|
|
526
|
+
### Too Clever (Avoid)
|
|
527
|
+
|
|
528
|
+
```typescript
|
|
529
|
+
const result = pipe(
|
|
530
|
+
data,
|
|
531
|
+
A.filter(flow(prop('status'), equals('active'))),
|
|
532
|
+
A.map(flow(prop('value'), multiply(2))),
|
|
533
|
+
A.reduce(monoid.concat, monoid.empty),
|
|
534
|
+
O.fromPredicate(gt(threshold))
|
|
535
|
+
)
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
### Just Right (Prefer)
|
|
539
|
+
|
|
540
|
+
```typescript
|
|
541
|
+
const activeItems = data.filter(item => item.status === 'active')
|
|
542
|
+
const doubledValues = activeItems.map(item => item.value * 2)
|
|
543
|
+
const total = doubledValues.reduce((sum, val) => sum + val, 0)
|
|
544
|
+
const result = total > threshold ? O.some(total) : O.none
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
### The Middle Ground (Often Best)
|
|
548
|
+
|
|
549
|
+
```typescript
|
|
550
|
+
const result = pipe(
|
|
551
|
+
data,
|
|
552
|
+
A.filter(item => item.status === 'active'),
|
|
553
|
+
A.map(item => item.value * 2),
|
|
554
|
+
A.reduce(0, (sum, val) => sum + val),
|
|
555
|
+
total => total > threshold ? O.some(total) : O.none
|
|
556
|
+
)
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
---
|
|
560
|
+
|
|
561
|
+
## Cheat Sheet
|
|
562
|
+
|
|
563
|
+
| What you want | Plain language | fp-ts |
|
|
564
|
+
|--------------|----------------|-------|
|
|
565
|
+
| Handle null/undefined | "Wrap this nullable" | `O.fromNullable(x)` |
|
|
566
|
+
| Default for missing | "Use this if nothing" | `O.getOrElse(() => default)` |
|
|
567
|
+
| Transform if present | "If something, change it" | `O.map(fn)` |
|
|
568
|
+
| Chain nullable operations | "If something, try this" | `O.flatMap(fn)` |
|
|
569
|
+
| Return success | "Worked, here's the value" | `E.right(value)` |
|
|
570
|
+
| Return failure | "Failed, here's why" | `E.left(error)` |
|
|
571
|
+
| Wrap throwing function | "Try this, catch errors" | `E.tryCatch(fn, onError)` |
|
|
572
|
+
| Handle both cases | "Do this for error, that for success" | `E.fold(onLeft, onRight)` |
|
|
573
|
+
| Chain operations | "Then do this, then that" | `pipe(x, fn1, fn2, fn3)` |
|
|
574
|
+
|
|
575
|
+
---
|
|
576
|
+
|
|
577
|
+
## When to Level Up
|
|
578
|
+
|
|
579
|
+
Once comfortable with these patterns, explore:
|
|
580
|
+
|
|
581
|
+
1. **TaskEither** - Async operations that can fail (replaces Promise + try/catch)
|
|
582
|
+
2. **Validation** - Collect ALL errors instead of stopping at first
|
|
583
|
+
3. **Reader** - Dependency injection without classes
|
|
584
|
+
4. **Do notation** - Cleaner syntax for multiple bindings
|
|
585
|
+
|
|
586
|
+
But don't rush. The basics here will handle 80% of real-world scenarios. Get comfortable with these before adding more tools to your belt.
|
|
587
|
+
|
|
588
|
+
---
|
|
589
|
+
|
|
590
|
+
## Summary
|
|
591
|
+
|
|
592
|
+
1. **Use pipe** for 3+ operations
|
|
593
|
+
2. **Use Option** for nullable chains
|
|
594
|
+
3. **Use Either** for operations that can fail
|
|
595
|
+
4. **Use map** to transform wrapped values
|
|
596
|
+
5. **Use flatMap** to chain operations that might fail
|
|
597
|
+
6. **Skip FP** when it hurts readability
|
|
598
|
+
7. **Keep it simple** - if your team can't read it, it's not good code
|