@ngxtm/devkit 3.6.1 → 3.8.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.
Files changed (773) hide show
  1. package/SKILLS_INDEX.md +2419 -634
  2. package/cli/update.js +145 -77
  3. package/merged-commands/3d-web-experience.md +254 -0
  4. package/merged-commands/ab-test-setup.md +232 -0
  5. package/merged-commands/accessibility-compliance-accessibility-audit.md +42 -0
  6. package/merged-commands/active-directory-attacks.md +383 -0
  7. package/merged-commands/address-github-comments.md +55 -0
  8. package/merged-commands/aesthetic.md +134 -0
  9. package/merged-commands/agent-evaluation.md +64 -0
  10. package/merged-commands/agent-framework-azure-hosted-agents.md +332 -0
  11. package/merged-commands/agent-manager-skill.md +40 -0
  12. package/merged-commands/agent-memory-mcp.md +82 -0
  13. package/merged-commands/agent-memory-systems.md +67 -0
  14. package/merged-commands/agent-orchestration-improve-agent.md +349 -0
  15. package/merged-commands/agent-orchestration-multi-agent-optimize.md +239 -0
  16. package/merged-commands/agent-tool-builder.md +53 -0
  17. package/merged-commands/agile-product-owner.md +31 -0
  18. package/merged-commands/ai-agents-architect.md +90 -0
  19. package/merged-commands/ai-artist.md +75 -0
  20. package/merged-commands/ai-engineer.md +171 -0
  21. package/merged-commands/ai-multimodal.md +109 -0
  22. package/merged-commands/ai-product.md +54 -0
  23. package/merged-commands/ai-wrapper-product.md +273 -0
  24. package/merged-commands/airflow-dag-patterns.md +41 -0
  25. package/merged-commands/algolia-search.md +66 -0
  26. package/merged-commands/algorithmic-art.md +405 -0
  27. package/merged-commands/analytics-tracking.md +404 -0
  28. package/merged-commands/angular-architect.md +97 -0
  29. package/merged-commands/angular-migration.md +428 -0
  30. package/merged-commands/anti-reversing-techniques.md +42 -0
  31. package/merged-commands/api-design-principles.md +37 -0
  32. package/merged-commands/api-designer.md +101 -0
  33. package/merged-commands/api-documentation-generator.md +484 -0
  34. package/merged-commands/api-documenter.md +184 -0
  35. package/merged-commands/api-fuzzing-bug-bounty.md +433 -0
  36. package/merged-commands/api-patterns.md +81 -0
  37. package/merged-commands/api-security-best-practices.md +907 -0
  38. package/merged-commands/api-testing-observability-api-mock.md +46 -0
  39. package/merged-commands/app-builder.md +75 -0
  40. package/merged-commands/app-store-optimization.md +403 -0
  41. package/merged-commands/application-performance-performance-optimization.md +154 -0
  42. package/merged-commands/architect-review.md +174 -0
  43. package/merged-commands/architecture-decision-records.md +441 -0
  44. package/merged-commands/architecture-designer.md +89 -0
  45. package/merged-commands/architecture-patterns.md +37 -0
  46. package/merged-commands/architecture.md +55 -0
  47. package/merged-commands/arm-cortex-expert.md +306 -0
  48. package/merged-commands/artifacts-builder.md +74 -0
  49. package/merged-commands/ask-questions-if-underspecified.md +81 -0
  50. package/merged-commands/async-python-patterns.md +39 -0
  51. package/merged-commands/atlassian-mcp.md +100 -0
  52. package/merged-commands/attack-tree-construction.md +38 -0
  53. package/merged-commands/auth-implementation-patterns.md +39 -0
  54. package/merged-commands/automate-whatsapp.md +257 -0
  55. package/merged-commands/autonomous-agent-patterns.md +761 -0
  56. package/merged-commands/autonomous-agents.md +68 -0
  57. package/merged-commands/avalonia-layout-zafiro.md +59 -0
  58. package/merged-commands/avalonia-viewmodels-zafiro.md +29 -0
  59. package/merged-commands/avalonia-zafiro-development.md +29 -0
  60. package/merged-commands/aws-agentic-ai.md +117 -0
  61. package/merged-commands/aws-cdk-development.md +278 -0
  62. package/merged-commands/aws-cost-operations.md +317 -0
  63. package/merged-commands/aws-penetration-testing.md +405 -0
  64. package/merged-commands/aws-serverless-eda.md +757 -0
  65. package/merged-commands/aws-serverless.md +323 -0
  66. package/merged-commands/aws-skills.md +22 -0
  67. package/merged-commands/azd-deployment.md +296 -0
  68. package/merged-commands/azure-ai-agents-python.md +277 -0
  69. package/merged-commands/azure-ai-search-python.md +198 -0
  70. package/merged-commands/azure-ai-voicelive-skill.md +294 -0
  71. package/merged-commands/azure-functions.md +42 -0
  72. package/merged-commands/backend-architect.md +333 -0
  73. package/merged-commands/backend-dev-guidelines.md +342 -0
  74. package/merged-commands/backend-development-feature-development.md +180 -0
  75. package/merged-commands/backend-development.md +155 -0
  76. package/merged-commands/backend-security-coder.md +156 -0
  77. package/merged-commands/backtesting-frameworks.md +39 -0
  78. package/merged-commands/bash-defensive-patterns.md +43 -0
  79. package/merged-commands/bash-linux.md +199 -0
  80. package/merged-commands/bash-pro.md +310 -0
  81. package/merged-commands/bats-testing-patterns.md +34 -0
  82. package/merged-commands/bazel-build-optimization.md +397 -0
  83. package/merged-commands/beautiful-prose.md +22 -0
  84. package/merged-commands/behavioral-modes.md +242 -0
  85. package/merged-commands/best-practices.md +500 -0
  86. package/merged-commands/better-auth.md +204 -0
  87. package/merged-commands/billing-automation.md +42 -0
  88. package/merged-commands/binary-analysis-patterns.md +450 -0
  89. package/merged-commands/blockchain-developer.md +208 -0
  90. package/merged-commands/blockrun.md +292 -0
  91. package/merged-commands/brainstorming.md +230 -0
  92. package/merged-commands/brand-guidelines-anthropic.md +73 -0
  93. package/merged-commands/brand-guidelines-community.md +73 -0
  94. package/merged-commands/brand-guidelines.md +73 -0
  95. package/merged-commands/broken-authentication.md +476 -0
  96. package/merged-commands/browser-automation.md +70 -0
  97. package/merged-commands/browser-extension-builder.md +261 -0
  98. package/merged-commands/building-ai-agent-on-cloudflare.md +391 -0
  99. package/merged-commands/building-mcp-server-on-cloudflare.md +265 -0
  100. package/merged-commands/bullmq-specialist.md +57 -0
  101. package/merged-commands/bun-development.md +691 -0
  102. package/merged-commands/burp-suite-testing.md +380 -0
  103. package/merged-commands/business-analyst.md +182 -0
  104. package/merged-commands/busybox-on-windows.md +30 -0
  105. package/merged-commands/c-pro.md +56 -0
  106. package/merged-commands/c4-architecture-c4-architecture.md +389 -0
  107. package/merged-commands/c4-code.md +244 -0
  108. package/merged-commands/c4-component.md +153 -0
  109. package/merged-commands/c4-container.md +171 -0
  110. package/merged-commands/c4-context.md +150 -0
  111. package/merged-commands/canvas-design.md +130 -0
  112. package/merged-commands/cc-skill-backend-patterns.md +584 -0
  113. package/merged-commands/cc-skill-clickhouse-io.md +431 -0
  114. package/merged-commands/cc-skill-coding-standards.md +522 -0
  115. package/merged-commands/cc-skill-continuous-learning.md +10 -0
  116. package/merged-commands/cc-skill-frontend-patterns.md +633 -0
  117. package/merged-commands/cc-skill-project-guidelines-example.md +352 -0
  118. package/merged-commands/cc-skill-security-review.md +496 -0
  119. package/merged-commands/cc-skill-strategic-compact.md +10 -0
  120. package/merged-commands/changelog-automation.md +38 -0
  121. package/merged-commands/changelog-generator.md +104 -0
  122. package/merged-commands/chaos-engineer.md +98 -0
  123. package/merged-commands/chrome-devtools.md +407 -0
  124. package/merged-commands/cicd-automation-workflow-automate.md +51 -0
  125. package/merged-commands/clarity-gate.md +22 -0
  126. package/merged-commands/claude-ally-health.md +22 -0
  127. package/merged-commands/claude-code-guide.md +68 -0
  128. package/merged-commands/claude-d3js-skill.md +820 -0
  129. package/merged-commands/claude-scientific-skills.md +22 -0
  130. package/merged-commands/claude-speed-reader.md +22 -0
  131. package/merged-commands/claude-win11-speckit-update-skill.md +22 -0
  132. package/merged-commands/clean-code.md +201 -0
  133. package/merged-commands/clerk-auth.md +56 -0
  134. package/merged-commands/cli-developer.md +97 -0
  135. package/merged-commands/cloud-architect.md +135 -0
  136. package/merged-commands/cloud-penetration-testing.md +501 -0
  137. package/merged-commands/cloudflare-expert.md +227 -0
  138. package/merged-commands/code-documentation-code-explain.md +46 -0
  139. package/merged-commands/code-documentation-doc-generate.md +48 -0
  140. package/merged-commands/code-documentation.md +263 -0
  141. package/merged-commands/code-documenter.md +95 -0
  142. package/merged-commands/code-refactoring-context-restore.md +179 -0
  143. package/merged-commands/code-refactoring-refactor-clean.md +51 -0
  144. package/merged-commands/code-refactoring-tech-debt.md +386 -0
  145. package/merged-commands/code-refactoring.md +209 -0
  146. package/merged-commands/code-review-ai-ai-review.md +450 -0
  147. package/merged-commands/code-review-checklist.md +444 -0
  148. package/merged-commands/code-review-excellence.md +40 -0
  149. package/merged-commands/code-review.md +121 -0
  150. package/merged-commands/code-reviewer.md +178 -0
  151. package/merged-commands/codebase-cleanup-deps-audit.md +51 -0
  152. package/merged-commands/codebase-cleanup-refactor-clean.md +51 -0
  153. package/merged-commands/codebase-cleanup-tech-debt.md +386 -0
  154. package/merged-commands/codex-review.md +37 -0
  155. package/merged-commands/commit.md +171 -0
  156. package/merged-commands/competitive-ads-extractor.md +293 -0
  157. package/merged-commands/competitive-landscape.md +34 -0
  158. package/merged-commands/competitor-alternatives.md +750 -0
  159. package/merged-commands/comprehensive-review-full-review.md +146 -0
  160. package/merged-commands/comprehensive-review-pr-enhance.md +46 -0
  161. package/merged-commands/computer-use-agents.md +315 -0
  162. package/merged-commands/concise-planning.md +62 -0
  163. package/merged-commands/conductor-implement.md +388 -0
  164. package/merged-commands/conductor-manage.md +39 -0
  165. package/merged-commands/conductor-new-track.md +433 -0
  166. package/merged-commands/conductor-revert.md +372 -0
  167. package/merged-commands/conductor-setup.md +426 -0
  168. package/merged-commands/conductor-status.md +338 -0
  169. package/merged-commands/conductor-validator.md +62 -0
  170. package/merged-commands/content-creator.md +248 -0
  171. package/merged-commands/content-marketer.md +170 -0
  172. package/merged-commands/content-research-writer.md +538 -0
  173. package/merged-commands/context-compression.md +266 -0
  174. package/merged-commands/context-degradation.md +238 -0
  175. package/merged-commands/context-driven-development.md +400 -0
  176. package/merged-commands/context-engineering.md +107 -0
  177. package/merged-commands/context-fundamentals.md +192 -0
  178. package/merged-commands/context-management-context-restore.md +179 -0
  179. package/merged-commands/context-management-context-save.md +177 -0
  180. package/merged-commands/context-manager.md +185 -0
  181. package/merged-commands/context-optimization.md +186 -0
  182. package/merged-commands/context-window-management.md +53 -0
  183. package/merged-commands/context7-auto-research.md +36 -0
  184. package/merged-commands/conversation-memory.md +61 -0
  185. package/merged-commands/copy-editing.md +439 -0
  186. package/merged-commands/copywriting.md +225 -0
  187. package/merged-commands/core-components.md +264 -0
  188. package/merged-commands/cosmos-db-python-skill.md +198 -0
  189. package/merged-commands/cost-optimization.md +286 -0
  190. package/merged-commands/cpp-pro.md +59 -0
  191. package/merged-commands/cqrs-implementation.md +35 -0
  192. package/merged-commands/create-pr.md +192 -0
  193. package/merged-commands/crewai.md +243 -0
  194. package/merged-commands/csharp-developer.md +94 -0
  195. package/merged-commands/csharp-pro.md +59 -0
  196. package/merged-commands/culture-index.md +43 -0
  197. package/merged-commands/customer-support.md +170 -0
  198. package/merged-commands/daily-news-report.md +356 -0
  199. package/merged-commands/data-engineer.md +224 -0
  200. package/merged-commands/data-engineering-data-driven-feature.md +182 -0
  201. package/merged-commands/data-engineering-data-pipeline.md +201 -0
  202. package/merged-commands/data-quality-frameworks.md +40 -0
  203. package/merged-commands/data-scientist.md +199 -0
  204. package/merged-commands/data-storytelling.md +465 -0
  205. package/merged-commands/database-admin.md +165 -0
  206. package/merged-commands/database-architect.md +268 -0
  207. package/merged-commands/database-cloud-optimization-cost-optimize.md +44 -0
  208. package/merged-commands/database-design.md +52 -0
  209. package/merged-commands/database-migration.md +436 -0
  210. package/merged-commands/database-migrations-migration-observability.md +420 -0
  211. package/merged-commands/database-migrations-sql-migrations.md +53 -0
  212. package/merged-commands/database-optimizer.md +167 -0
  213. package/merged-commands/databases.md +232 -0
  214. package/merged-commands/dbt-transformation-patterns.md +34 -0
  215. package/merged-commands/debugger.md +49 -0
  216. package/merged-commands/debugging-strategies.md +34 -0
  217. package/merged-commands/debugging-toolkit-smart-debug.md +197 -0
  218. package/merged-commands/debugging-wizard.md +93 -0
  219. package/merged-commands/debugging.md +84 -0
  220. package/merged-commands/deep-research.md +114 -0
  221. package/merged-commands/defi-protocol-templates.md +466 -0
  222. package/merged-commands/dependency-management-deps-audit.md +44 -0
  223. package/merged-commands/dependency-upgrade.md +421 -0
  224. package/merged-commands/deployment-engineer.md +170 -0
  225. package/merged-commands/deployment-pipeline-design.md +371 -0
  226. package/merged-commands/deployment-procedures.md +241 -0
  227. package/merged-commands/deployment-validation-config-validate.md +496 -0
  228. package/merged-commands/design-md.md +178 -0
  229. package/merged-commands/design-orchestration.md +167 -0
  230. package/merged-commands/developer-growth-analysis.md +322 -0
  231. package/merged-commands/devops-engineer.md +92 -0
  232. package/merged-commands/devops-troubleshooter.md +161 -0
  233. package/merged-commands/devops.md +285 -0
  234. package/merged-commands/discord-bot-architect.md +277 -0
  235. package/merged-commands/dispatching-parallel-agents.md +180 -0
  236. package/merged-commands/distributed-debugging-debug-trace.md +44 -0
  237. package/merged-commands/distributed-tracing.md +450 -0
  238. package/merged-commands/django-expert.md +89 -0
  239. package/merged-commands/django-pro.md +180 -0
  240. package/merged-commands/doc-coauthoring.md +375 -0
  241. package/merged-commands/docker-expert.md +409 -0
  242. package/merged-commands/docs-architect.md +98 -0
  243. package/merged-commands/docs-seeker.md +102 -0
  244. package/merged-commands/documentation-generation-doc-generate.md +48 -0
  245. package/merged-commands/documentation-templates.md +194 -0
  246. package/merged-commands/docx-official.md +197 -0
  247. package/merged-commands/docx.md +197 -0
  248. package/merged-commands/domain-name-brainstormer.md +212 -0
  249. package/merged-commands/dotnet-architect.md +197 -0
  250. package/merged-commands/dotnet-backend-patterns.md +37 -0
  251. package/merged-commands/dotnet-core-expert.md +96 -0
  252. package/merged-commands/dx-optimizer.md +83 -0
  253. package/merged-commands/e2e-testing-patterns.md +41 -0
  254. package/merged-commands/elixir-pro.md +59 -0
  255. package/merged-commands/email-sequence.md +925 -0
  256. package/merged-commands/email-systems.md +54 -0
  257. package/merged-commands/embedded-systems.md +98 -0
  258. package/merged-commands/embedding-strategies.md +491 -0
  259. package/merged-commands/employment-contract-templates.md +39 -0
  260. package/merged-commands/environment-setup-guide.md +479 -0
  261. package/merged-commands/error-debugging-error-analysis.md +47 -0
  262. package/merged-commands/error-debugging-error-trace.md +43 -0
  263. package/merged-commands/error-debugging-multi-agent-review.md +216 -0
  264. package/merged-commands/error-detective.md +53 -0
  265. package/merged-commands/error-diagnostics-error-analysis.md +47 -0
  266. package/merged-commands/error-diagnostics-error-trace.md +48 -0
  267. package/merged-commands/error-diagnostics-smart-debug.md +197 -0
  268. package/merged-commands/error-handling-patterns.md +35 -0
  269. package/merged-commands/ethical-hacking-methodology.md +466 -0
  270. package/merged-commands/evaluation.md +238 -0
  271. package/merged-commands/event-sourcing-architect.md +58 -0
  272. package/merged-commands/event-store-design.md +449 -0
  273. package/merged-commands/exa-search.md +36 -0
  274. package/merged-commands/executing-plans.md +76 -0
  275. package/merged-commands/expo-app-design.md +22 -0
  276. package/merged-commands/expo-deployment.md +72 -0
  277. package/merged-commands/fal-audio.md +22 -0
  278. package/merged-commands/fal-generate.md +22 -0
  279. package/merged-commands/fal-image-edit.md +22 -0
  280. package/merged-commands/fal-platform.md +22 -0
  281. package/merged-commands/fal-upscale.md +22 -0
  282. package/merged-commands/fal-workflow.md +22 -0
  283. package/merged-commands/fastapi-expert.md +93 -0
  284. package/merged-commands/fastapi-pro.md +192 -0
  285. package/merged-commands/fastapi-router.md +52 -0
  286. package/merged-commands/fastapi-templates.md +32 -0
  287. package/merged-commands/feature-forge.md +90 -0
  288. package/merged-commands/ffuf-claude-skill.md +22 -0
  289. package/merged-commands/file-organizer.md +250 -0
  290. package/merged-commands/file-path-traversal.md +486 -0
  291. package/merged-commands/file-uploads.md +22 -0
  292. package/merged-commands/find-bugs.md +86 -0
  293. package/merged-commands/fine-tuning-expert.md +98 -0
  294. package/merged-commands/finishing-a-development-branch.md +200 -0
  295. package/merged-commands/firebase.md +56 -0
  296. package/merged-commands/firecrawl-scraper.md +37 -0
  297. package/merged-commands/firmware-analyst.md +320 -0
  298. package/merged-commands/fix-review.md +53 -0
  299. package/merged-commands/fixing.md +72 -0
  300. package/merged-commands/flutter-expert.md +200 -0
  301. package/merged-commands/form-cro.md +441 -0
  302. package/merged-commands/foundry-iq-agent.md +15 -0
  303. package/merged-commands/foundry-iq-python.md +275 -0
  304. package/merged-commands/foundry-nextgen-frontend.md +555 -0
  305. package/merged-commands/foundry-sdk-python.md +290 -0
  306. package/merged-commands/fp-ts-errors.md +856 -0
  307. package/merged-commands/fp-ts-pragmatic.md +598 -0
  308. package/merged-commands/fp-ts-react.md +796 -0
  309. package/merged-commands/framework-migration-code-migrate.md +48 -0
  310. package/merged-commands/framework-migration-deps-upgrade.md +48 -0
  311. package/merged-commands/framework-migration-legacy-modernize.md +132 -0
  312. package/merged-commands/free-tool-strategy.md +576 -0
  313. package/merged-commands/frontend-design.md +272 -0
  314. package/merged-commands/frontend-dev-guidelines.md +359 -0
  315. package/merged-commands/frontend-developer.md +171 -0
  316. package/merged-commands/frontend-development.md +399 -0
  317. package/merged-commands/frontend-mobile-development-component-scaffold.md +403 -0
  318. package/merged-commands/frontend-mobile-security-xss-scan.md +322 -0
  319. package/merged-commands/frontend-security-coder.md +170 -0
  320. package/merged-commands/frontend-slides.md +770 -0
  321. package/merged-commands/full-stack-orchestration-full-stack-feature.md +135 -0
  322. package/merged-commands/fullstack-guardian.md +99 -0
  323. package/merged-commands/game-developer.md +94 -0
  324. package/merged-commands/game-development.md +167 -0
  325. package/merged-commands/gcp-cloud-run.md +288 -0
  326. package/merged-commands/gdpr-data-handling.md +33 -0
  327. package/merged-commands/geo-fundamentals.md +156 -0
  328. package/merged-commands/git-advanced-workflows.md +412 -0
  329. package/merged-commands/git-pr-workflows-git-workflow.md +140 -0
  330. package/merged-commands/git-pr-workflows-onboard.md +416 -0
  331. package/merged-commands/git-pr-workflows-pr-enhance.md +48 -0
  332. package/merged-commands/git-pushing.md +33 -0
  333. package/merged-commands/github-actions-templates.md +345 -0
  334. package/merged-commands/github-workflow-automation.md +846 -0
  335. package/merged-commands/gitlab-ci-patterns.md +283 -0
  336. package/merged-commands/gitops-workflow.md +303 -0
  337. package/merged-commands/go-concurrency-patterns.md +33 -0
  338. package/merged-commands/godot-gdscript-patterns.md +33 -0
  339. package/merged-commands/golang-pro.md +179 -0
  340. package/merged-commands/google-adk-python.md +243 -0
  341. package/merged-commands/grafana-dashboards.md +381 -0
  342. package/merged-commands/graphql-architect.md +182 -0
  343. package/merged-commands/graphql.md +68 -0
  344. package/merged-commands/haskell-pro.md +56 -0
  345. package/merged-commands/helm-chart-scaffolding.md +34 -0
  346. package/merged-commands/hr-pro.md +126 -0
  347. package/merged-commands/html-injection-testing.md +498 -0
  348. package/merged-commands/hubspot-integration.md +42 -0
  349. package/merged-commands/hugging-face-cli.md +198 -0
  350. package/merged-commands/hugging-face-jobs.md +1038 -0
  351. package/merged-commands/hybrid-cloud-architect.md +168 -0
  352. package/merged-commands/hybrid-cloud-networking.md +238 -0
  353. package/merged-commands/hybrid-search-implementation.md +32 -0
  354. package/merged-commands/i18n-localization.md +154 -0
  355. package/merged-commands/idor-testing.md +442 -0
  356. package/merged-commands/image-enhancer.md +99 -0
  357. package/merged-commands/imagen.md +77 -0
  358. package/merged-commands/incident-responder.md +213 -0
  359. package/merged-commands/incident-response-incident-response.md +168 -0
  360. package/merged-commands/incident-response-smart-fix.md +29 -0
  361. package/merged-commands/incident-runbook-templates.md +395 -0
  362. package/merged-commands/infinite-gratitude.md +26 -0
  363. package/merged-commands/inngest.md +55 -0
  364. package/merged-commands/interactive-portfolio.md +223 -0
  365. package/merged-commands/internal-comms-anthropic.md +32 -0
  366. package/merged-commands/internal-comms-community.md +32 -0
  367. package/merged-commands/internal-comms.md +32 -0
  368. package/merged-commands/invoice-organizer.md +446 -0
  369. package/merged-commands/ios-developer.md +219 -0
  370. package/merged-commands/issue-creator.md +137 -0
  371. package/merged-commands/istio-traffic-management.md +337 -0
  372. package/merged-commands/iterate-pr.md +150 -0
  373. package/merged-commands/java-architect.md +95 -0
  374. package/merged-commands/java-pro.md +177 -0
  375. package/merged-commands/javascript-mastery.md +645 -0
  376. package/merged-commands/javascript-pro.md +57 -0
  377. package/merged-commands/javascript-testing-patterns.md +35 -0
  378. package/merged-commands/javascript-typescript-typescript-scaffold.md +361 -0
  379. package/merged-commands/javascript-typescript.md +142 -0
  380. package/merged-commands/jira-issues.md +181 -0
  381. package/merged-commands/job-application.md +90 -0
  382. package/merged-commands/julia-pro.md +209 -0
  383. package/merged-commands/k8s-manifest-generator.md +35 -0
  384. package/merged-commands/k8s-security-policies.md +346 -0
  385. package/merged-commands/kaizen.md +730 -0
  386. package/merged-commands/kotlin-specialist.md +94 -0
  387. package/merged-commands/kpi-dashboard-design.md +440 -0
  388. package/merged-commands/kubernetes-architect.md +170 -0
  389. package/merged-commands/kubernetes-specialist.md +117 -0
  390. package/merged-commands/langchain-architecture.md +350 -0
  391. package/merged-commands/langfuse.md +238 -0
  392. package/merged-commands/langgraph.md +287 -0
  393. package/merged-commands/laravel-specialist.md +101 -0
  394. package/merged-commands/last30days.md +421 -0
  395. package/merged-commands/launch-strategy.md +344 -0
  396. package/merged-commands/lead-research-assistant.md +199 -0
  397. package/merged-commands/learn.md +476 -0
  398. package/merged-commands/legacy-modernizer.md +53 -0
  399. package/merged-commands/legal-advisor.md +70 -0
  400. package/merged-commands/linear-claude-skill.md +543 -0
  401. package/merged-commands/linkerd-patterns.md +321 -0
  402. package/merged-commands/lint-and-validate.md +45 -0
  403. package/merged-commands/linux-privilege-escalation.md +504 -0
  404. package/merged-commands/linux-shell-scripting.md +504 -0
  405. package/merged-commands/llm-app-patterns.md +760 -0
  406. package/merged-commands/llm-application-dev-ai-assistant.md +35 -0
  407. package/merged-commands/llm-application-dev-langchain-agent.md +246 -0
  408. package/merged-commands/llm-application-dev-prompt-optimize.md +37 -0
  409. package/merged-commands/llm-application-dev.md +216 -0
  410. package/merged-commands/llm-evaluation.md +483 -0
  411. package/merged-commands/loki-mode.md +721 -0
  412. package/merged-commands/machine-learning-ops-ml-pipeline.md +314 -0
  413. package/merged-commands/makepad-skills.md +22 -0
  414. package/merged-commands/malware-analyst.md +247 -0
  415. package/merged-commands/markdown-novel-viewer.md +281 -0
  416. package/merged-commands/market-sizing-analysis.md +425 -0
  417. package/merged-commands/marketing-ideas.md +221 -0
  418. package/merged-commands/marketing-psychology.md +255 -0
  419. package/merged-commands/mcp-builder.md +236 -0
  420. package/merged-commands/mcp-developer.md +94 -0
  421. package/merged-commands/mcp-management.md +209 -0
  422. package/merged-commands/media-processing.md +358 -0
  423. package/merged-commands/meeting-insights-analyzer.md +327 -0
  424. package/merged-commands/memory-forensics.md +491 -0
  425. package/merged-commands/memory-safety-patterns.md +33 -0
  426. package/merged-commands/memory-systems.md +228 -0
  427. package/merged-commands/mermaid-expert.md +59 -0
  428. package/merged-commands/mermaidjs-v11.md +115 -0
  429. package/merged-commands/metasploit-framework.md +478 -0
  430. package/merged-commands/micro-saas-launcher.md +212 -0
  431. package/merged-commands/microservices-architect.md +102 -0
  432. package/merged-commands/microservices-patterns.md +35 -0
  433. package/merged-commands/minecraft-bukkit-pro.md +126 -0
  434. package/merged-commands/ml-engineer.md +168 -0
  435. package/merged-commands/ml-pipeline-workflow.md +257 -0
  436. package/merged-commands/ml-pipeline.md +111 -0
  437. package/merged-commands/mlops-engineer.md +219 -0
  438. package/merged-commands/mobile-design.md +284 -0
  439. package/merged-commands/mobile-developer.md +205 -0
  440. package/merged-commands/mobile-development.md +212 -0
  441. package/merged-commands/mobile-security-coder.md +184 -0
  442. package/merged-commands/modern-javascript-patterns.md +35 -0
  443. package/merged-commands/monitoring-expert.md +92 -0
  444. package/merged-commands/monorepo-architect.md +61 -0
  445. package/merged-commands/monorepo-management.md +35 -0
  446. package/merged-commands/moodle-external-api-development.md +597 -0
  447. package/merged-commands/mtls-configuration.md +359 -0
  448. package/merged-commands/multi-agent-brainstorming.md +256 -0
  449. package/merged-commands/multi-agent-patterns.md +262 -0
  450. package/merged-commands/multi-cloud-architecture.md +189 -0
  451. package/merged-commands/multi-platform-apps-multi-platform.md +203 -0
  452. package/merged-commands/n8n-code-python.md +750 -0
  453. package/merged-commands/n8n-mcp-tools-expert.md +654 -0
  454. package/merged-commands/n8n-node-configuration.md +796 -0
  455. package/merged-commands/nanobanana-ppt-skills.md +22 -0
  456. package/merged-commands/neon-postgres.md +56 -0
  457. package/merged-commands/nestjs-expert.md +552 -0
  458. package/merged-commands/network-101.md +342 -0
  459. package/merged-commands/network-engineer.md +169 -0
  460. package/merged-commands/nextjs-app-router-patterns.md +33 -0
  461. package/merged-commands/nextjs-best-practices.md +203 -0
  462. package/merged-commands/nextjs-developer.md +97 -0
  463. package/merged-commands/nextjs-supabase-auth.md +56 -0
  464. package/merged-commands/nft-standards.md +395 -0
  465. package/merged-commands/nodejs-backend-patterns.md +35 -0
  466. package/merged-commands/nodejs-best-practices.md +333 -0
  467. package/merged-commands/nosql-expert.md +111 -0
  468. package/merged-commands/notebooklm-skill.md +269 -0
  469. package/merged-commands/notebooklm.md +269 -0
  470. package/merged-commands/notion-template-business.md +216 -0
  471. package/merged-commands/nx-workspace-patterns.md +464 -0
  472. package/merged-commands/observability-engineer.md +237 -0
  473. package/merged-commands/observability-monitoring-monitor-setup.md +48 -0
  474. package/merged-commands/observability-monitoring-slo-implement.md +43 -0
  475. package/merged-commands/observe-whatsapp.md +109 -0
  476. package/merged-commands/obsidian-clipper-template-creator.md +64 -0
  477. package/merged-commands/on-call-handoff-patterns.md +453 -0
  478. package/merged-commands/onboarding-cro.md +433 -0
  479. package/merged-commands/openapi-spec-generation.md +33 -0
  480. package/merged-commands/page-cro.md +343 -0
  481. package/merged-commands/paid-ads.md +551 -0
  482. package/merged-commands/pandas-pro.md +96 -0
  483. package/merged-commands/parallel-agents.md +175 -0
  484. package/merged-commands/payment-integration.md +77 -0
  485. package/merged-commands/paypal-integration.md +479 -0
  486. package/merged-commands/paywall-upgrade-cro.md +570 -0
  487. package/merged-commands/pci-compliance.md +478 -0
  488. package/merged-commands/pdf-official.md +294 -0
  489. package/merged-commands/pdf.md +294 -0
  490. package/merged-commands/pentest-checklist.md +334 -0
  491. package/merged-commands/pentest-commands.md +438 -0
  492. package/merged-commands/performance-engineer.md +180 -0
  493. package/merged-commands/performance-profiling.md +143 -0
  494. package/merged-commands/performance-testing-review-ai-review.md +450 -0
  495. package/merged-commands/performance-testing-review-multi-agent-review.md +216 -0
  496. package/merged-commands/personal-tool-builder.md +289 -0
  497. package/merged-commands/php-pro.md +63 -0
  498. package/merged-commands/plaid-fintech.md +50 -0
  499. package/merged-commands/plan-writing.md +152 -0
  500. package/merged-commands/planning-with-files.md +211 -0
  501. package/merged-commands/planning.md +95 -0
  502. package/merged-commands/plans-kanban.md +166 -0
  503. package/merged-commands/playwright-expert.md +87 -0
  504. package/merged-commands/playwright-skill.md +453 -0
  505. package/merged-commands/podcast-generation.md +121 -0
  506. package/merged-commands/popup-cro.md +346 -0
  507. package/merged-commands/posix-shell-pro.md +304 -0
  508. package/merged-commands/postgres-best-practices.md +57 -0
  509. package/merged-commands/postgres-pro.md +98 -0
  510. package/merged-commands/postgresql.md +230 -0
  511. package/merged-commands/postmortem-writing.md +386 -0
  512. package/merged-commands/powershell-windows.md +167 -0
  513. package/merged-commands/pptx-official.md +484 -0
  514. package/merged-commands/pptx.md +484 -0
  515. package/merged-commands/pricing-strategy.md +356 -0
  516. package/merged-commands/prisma-expert.md +355 -0
  517. package/merged-commands/privilege-escalation-methods.md +333 -0
  518. package/merged-commands/problem-solving.md +96 -0
  519. package/merged-commands/product-manager-toolkit.md +351 -0
  520. package/merged-commands/product-strategist.md +26 -0
  521. package/merged-commands/production-code-audit.md +540 -0
  522. package/merged-commands/programmatic-seo.md +351 -0
  523. package/merged-commands/projection-patterns.md +33 -0
  524. package/merged-commands/prometheus-configuration.md +404 -0
  525. package/merged-commands/prompt-caching.md +61 -0
  526. package/merged-commands/prompt-engineer.md +272 -0
  527. package/merged-commands/prompt-engineering-patterns.md +213 -0
  528. package/merged-commands/prompt-engineering.md +171 -0
  529. package/merged-commands/prompt-library.md +322 -0
  530. package/merged-commands/protocol-reverse-engineering.md +29 -0
  531. package/merged-commands/pydantic-models.md +58 -0
  532. package/merged-commands/pypict-skill.md +22 -0
  533. package/merged-commands/python-development-python-scaffold.md +331 -0
  534. package/merged-commands/python-development.md +139 -0
  535. package/merged-commands/python-packaging.md +36 -0
  536. package/merged-commands/python-patterns.md +441 -0
  537. package/merged-commands/python-performance-optimization.md +36 -0
  538. package/merged-commands/python-pro.md +158 -0
  539. package/merged-commands/python-testing-patterns.md +37 -0
  540. package/merged-commands/qa-regression.md +337 -0
  541. package/merged-commands/quant-analyst.md +53 -0
  542. package/merged-commands/radix-ui-design-system.md +847 -0
  543. package/merged-commands/raffle-winner-picker.md +159 -0
  544. package/merged-commands/rag-architect.md +100 -0
  545. package/merged-commands/rag-engineer.md +90 -0
  546. package/merged-commands/rag-implementation.md +421 -0
  547. package/merged-commands/rails-expert.md +97 -0
  548. package/merged-commands/react-best-practices.md +121 -0
  549. package/merged-commands/react-expert.md +98 -0
  550. package/merged-commands/react-flow-node.md +66 -0
  551. package/merged-commands/react-modernization.md +34 -0
  552. package/merged-commands/react-native-architecture.md +33 -0
  553. package/merged-commands/react-native-expert.md +88 -0
  554. package/merged-commands/react-patterns.md +198 -0
  555. package/merged-commands/react-state-management.md +441 -0
  556. package/merged-commands/react-ui-patterns.md +289 -0
  557. package/merged-commands/readme.md +775 -0
  558. package/merged-commands/receiving-code-review.md +213 -0
  559. package/merged-commands/red-team-tactics.md +199 -0
  560. package/merged-commands/red-team-tools.md +310 -0
  561. package/merged-commands/reference-builder.md +188 -0
  562. package/merged-commands/referral-program.md +602 -0
  563. package/merged-commands/remotion-best-practices.md +45 -0
  564. package/merged-commands/repomix.md +275 -0
  565. package/merged-commands/requesting-code-review.md +105 -0
  566. package/merged-commands/research-engineer.md +135 -0
  567. package/merged-commands/research.md +191 -0
  568. package/merged-commands/reverse-engineer.md +173 -0
  569. package/merged-commands/risk-manager.md +61 -0
  570. package/merged-commands/risk-metrics-calculation.md +33 -0
  571. package/merged-commands/ruby-pro.md +56 -0
  572. package/merged-commands/rust-async-patterns.md +33 -0
  573. package/merged-commands/rust-engineer.md +96 -0
  574. package/merged-commands/rust-pro.md +178 -0
  575. package/merged-commands/saga-orchestration.md +496 -0
  576. package/merged-commands/sales-automator.md +55 -0
  577. package/merged-commands/salesforce-developer.md +105 -0
  578. package/merged-commands/salesforce-development.md +51 -0
  579. package/merged-commands/sast-configuration.md +212 -0
  580. package/merged-commands/scala-pro.md +82 -0
  581. package/merged-commands/scanning-tools.md +589 -0
  582. package/merged-commands/schema-markup.md +360 -0
  583. package/merged-commands/screen-reader-testing.md +33 -0
  584. package/merged-commands/screenshots.md +401 -0
  585. package/merged-commands/scroll-experience.md +263 -0
  586. package/merged-commands/search-specialist.md +80 -0
  587. package/merged-commands/secrets-management.md +364 -0
  588. package/merged-commands/secure-code-guardian.md +93 -0
  589. package/merged-commands/security-auditor.md +169 -0
  590. package/merged-commands/security-bluebook-builder.md +22 -0
  591. package/merged-commands/security-compliance-compliance-check.md +55 -0
  592. package/merged-commands/security-requirement-extraction.md +33 -0
  593. package/merged-commands/security-reviewer.md +94 -0
  594. package/merged-commands/security-scanning-security-dependencies.md +43 -0
  595. package/merged-commands/security-scanning-security-hardening.md +147 -0
  596. package/merged-commands/security-scanning-security-sast.md +495 -0
  597. package/merged-commands/segment-cdp.md +50 -0
  598. package/merged-commands/senior-architect.md +209 -0
  599. package/merged-commands/senior-backend.md +209 -0
  600. package/merged-commands/senior-computer-vision.md +226 -0
  601. package/merged-commands/senior-data-engineer.md +226 -0
  602. package/merged-commands/senior-data-scientist.md +226 -0
  603. package/merged-commands/senior-devops.md +209 -0
  604. package/merged-commands/senior-frontend.md +209 -0
  605. package/merged-commands/senior-fullstack.md +209 -0
  606. package/merged-commands/senior-ml-engineer.md +226 -0
  607. package/merged-commands/senior-prompt-engineer.md +226 -0
  608. package/merged-commands/senior-qa.md +209 -0
  609. package/merged-commands/senior-secops.md +209 -0
  610. package/merged-commands/senior-security.md +209 -0
  611. package/merged-commands/seo-audit.md +487 -0
  612. package/merged-commands/seo-authority-builder.md +136 -0
  613. package/merged-commands/seo-cannibalization-detector.md +123 -0
  614. package/merged-commands/seo-content-auditor.md +83 -0
  615. package/merged-commands/seo-content-planner.md +108 -0
  616. package/merged-commands/seo-content-refresher.md +118 -0
  617. package/merged-commands/seo-content-writer.md +96 -0
  618. package/merged-commands/seo-fundamentals.md +173 -0
  619. package/merged-commands/seo-keyword-strategist.md +95 -0
  620. package/merged-commands/seo-meta-optimizer.md +92 -0
  621. package/merged-commands/seo-snippet-hunter.md +114 -0
  622. package/merged-commands/seo-structure-architect.md +108 -0
  623. package/merged-commands/sequential-thinking.md +94 -0
  624. package/merged-commands/server-management.md +161 -0
  625. package/merged-commands/service-mesh-expert.md +58 -0
  626. package/merged-commands/service-mesh-observability.md +395 -0
  627. package/merged-commands/sharp-edges.md +70 -0
  628. package/merged-commands/shellcheck-configuration.md +466 -0
  629. package/merged-commands/shodan-reconnaissance.md +503 -0
  630. package/merged-commands/shopify-apps.md +42 -0
  631. package/merged-commands/shopify-development.md +366 -0
  632. package/merged-commands/shopify-expert.md +102 -0
  633. package/merged-commands/signup-flow-cro.md +355 -0
  634. package/merged-commands/similarity-search-patterns.md +33 -0
  635. package/merged-commands/skill-creator.md +356 -0
  636. package/merged-commands/skill-developer.md +426 -0
  637. package/merged-commands/skill-rails-upgrade.md +408 -0
  638. package/merged-commands/skill-seekers.md +22 -0
  639. package/merged-commands/skill-share.md +80 -0
  640. package/merged-commands/slack-bot-builder.md +264 -0
  641. package/merged-commands/slack-gif-creator.md +254 -0
  642. package/merged-commands/slo-implementation.md +341 -0
  643. package/merged-commands/smtp-penetration-testing.md +500 -0
  644. package/merged-commands/social-content.md +807 -0
  645. package/merged-commands/software-architecture.md +75 -0
  646. package/merged-commands/solidity-security.md +34 -0
  647. package/merged-commands/spark-engineer.md +100 -0
  648. package/merged-commands/spark-optimization.md +427 -0
  649. package/merged-commands/spec-miner.md +88 -0
  650. package/merged-commands/spring-boot-engineer.md +104 -0
  651. package/merged-commands/sql-injection-testing.md +448 -0
  652. package/merged-commands/sql-optimization-patterns.md +35 -0
  653. package/merged-commands/sql-pro.md +173 -0
  654. package/merged-commands/sqlmap-database-pentesting.md +400 -0
  655. package/merged-commands/sre-engineer.md +98 -0
  656. package/merged-commands/ssh-penetration-testing.md +488 -0
  657. package/merged-commands/startup-analyst.md +328 -0
  658. package/merged-commands/startup-business-analyst-business-case.md +487 -0
  659. package/merged-commands/startup-business-analyst-financial-projections.md +353 -0
  660. package/merged-commands/startup-business-analyst-market-opportunity.md +240 -0
  661. package/merged-commands/startup-financial-modeling.md +467 -0
  662. package/merged-commands/startup-metrics-framework.md +34 -0
  663. package/merged-commands/stitch-ui-design.md +378 -0
  664. package/merged-commands/stride-analysis-patterns.md +33 -0
  665. package/merged-commands/stripe-integration.md +454 -0
  666. package/merged-commands/subagent-driven-development.md +240 -0
  667. package/merged-commands/superpowers-lab.md +22 -0
  668. package/merged-commands/swift-expert.md +94 -0
  669. package/merged-commands/swiftui-expert-skill.md +275 -0
  670. package/merged-commands/systematic-debugging.md +296 -0
  671. package/merged-commands/systems-programming-rust-project.md +440 -0
  672. package/merged-commands/tailwind-design-system.md +33 -0
  673. package/merged-commands/tailwind-patterns.md +269 -0
  674. package/merged-commands/tavily-web.md +36 -0
  675. package/merged-commands/tdd-orchestrator.md +205 -0
  676. package/merged-commands/tdd-workflow.md +149 -0
  677. package/merged-commands/tdd-workflows-tdd-cycle.md +221 -0
  678. package/merged-commands/tdd-workflows-tdd-green.md +73 -0
  679. package/merged-commands/tdd-workflows-tdd-red.md +164 -0
  680. package/merged-commands/tdd-workflows-tdd-refactor.md +187 -0
  681. package/merged-commands/team-collaboration-issue.md +37 -0
  682. package/merged-commands/team-collaboration-standup-notes.md +44 -0
  683. package/merged-commands/team-composition-analysis.md +413 -0
  684. package/merged-commands/telegram-bot-builder.md +254 -0
  685. package/merged-commands/telegram-mini-app.md +279 -0
  686. package/merged-commands/template-skill.md +6 -0
  687. package/merged-commands/temporal-python-pro.md +370 -0
  688. package/merged-commands/temporal-python-testing.md +170 -0
  689. package/merged-commands/terraform-engineer.md +97 -0
  690. package/merged-commands/terraform-module-library.md +261 -0
  691. package/merged-commands/terraform-skill.md +517 -0
  692. package/merged-commands/terraform-specialist.md +166 -0
  693. package/merged-commands/test-automator.md +224 -0
  694. package/merged-commands/test-driven-development.md +371 -0
  695. package/merged-commands/test-fixing.md +119 -0
  696. package/merged-commands/test-master.md +104 -0
  697. package/merged-commands/testing-patterns.md +259 -0
  698. package/merged-commands/theme-factory.md +59 -0
  699. package/merged-commands/threat-mitigation-mapping.md +33 -0
  700. package/merged-commands/threat-modeling-expert.md +60 -0
  701. package/merged-commands/threejs-skills.md +22 -0
  702. package/merged-commands/threejs.md +89 -0
  703. package/merged-commands/tool-design.md +318 -0
  704. package/merged-commands/top-web-vulnerabilities.md +543 -0
  705. package/merged-commands/track-management.md +38 -0
  706. package/merged-commands/trigger-dev.md +67 -0
  707. package/merged-commands/turborepo-caching.md +419 -0
  708. package/merged-commands/tutorial-engineer.md +139 -0
  709. package/merged-commands/twilio-communications.md +295 -0
  710. package/merged-commands/typescript-advanced-types.md +35 -0
  711. package/merged-commands/typescript-expert.md +429 -0
  712. package/merged-commands/typescript-pro.md +55 -0
  713. package/merged-commands/ui-design-system.md +32 -0
  714. package/merged-commands/ui-skills.md +22 -0
  715. package/merged-commands/ui-styling.md +321 -0
  716. package/merged-commands/ui-ux-designer.md +209 -0
  717. package/merged-commands/ui-ux-pro-max.md +351 -0
  718. package/merged-commands/ui-visual-validator.md +214 -0
  719. package/merged-commands/unit-testing-test-generate.md +319 -0
  720. package/merged-commands/unity-developer.md +230 -0
  721. package/merged-commands/unity-ecs-patterns.md +33 -0
  722. package/merged-commands/unreal-engine-cpp-pro.md +114 -0
  723. package/merged-commands/upgrading-expo.md +118 -0
  724. package/merged-commands/upstash-qstash.md +68 -0
  725. package/merged-commands/using-git-worktrees.md +217 -0
  726. package/merged-commands/using-neon.md +84 -0
  727. package/merged-commands/using-superpowers.md +87 -0
  728. package/merged-commands/uv-package-manager.md +37 -0
  729. package/merged-commands/ux-researcher-designer.md +30 -0
  730. package/merged-commands/varlock-claude-skill.md +22 -0
  731. package/merged-commands/vector-database-engineer.md +60 -0
  732. package/merged-commands/vector-index-tuning.md +42 -0
  733. package/merged-commands/vercel-deploy-claimable.md +120 -0
  734. package/merged-commands/vercel-deploy.md +22 -0
  735. package/merged-commands/vercel-deployment.md +79 -0
  736. package/merged-commands/verification-before-completion.md +139 -0
  737. package/merged-commands/vexor.md +22 -0
  738. package/merged-commands/video-downloader.md +106 -0
  739. package/merged-commands/viral-generator-builder.md +199 -0
  740. package/merged-commands/voice-agents.md +68 -0
  741. package/merged-commands/voice-ai-development.md +302 -0
  742. package/merged-commands/voice-ai-engine-development.md +721 -0
  743. package/merged-commands/vue-expert-js.md +91 -0
  744. package/merged-commands/vue-expert.md +374 -0
  745. package/merged-commands/vulnerability-scanner.md +276 -0
  746. package/merged-commands/wcag-audit-patterns.md +41 -0
  747. package/merged-commands/web-artifacts-builder.md +74 -0
  748. package/merged-commands/web-design-guidelines.md +36 -0
  749. package/merged-commands/web-frameworks.md +324 -0
  750. package/merged-commands/web-performance-optimization.md +646 -0
  751. package/merged-commands/web3-testing.md +427 -0
  752. package/merged-commands/webapp-testing.md +96 -0
  753. package/merged-commands/websocket-engineer.md +96 -0
  754. package/merged-commands/windows-privilege-escalation.md +496 -0
  755. package/merged-commands/wireshark-analysis.md +497 -0
  756. package/merged-commands/wordpress-penetration-testing.md +485 -0
  757. package/merged-commands/wordpress-pro.md +105 -0
  758. package/merged-commands/workflow-automation.md +68 -0
  759. package/merged-commands/workflow-orchestration-patterns.md +333 -0
  760. package/merged-commands/workflow-patterns.md +38 -0
  761. package/merged-commands/writing-plans.md +116 -0
  762. package/merged-commands/writing-skills.md +125 -0
  763. package/merged-commands/x-article-publisher-skill.md +22 -0
  764. package/merged-commands/xlsx-official.md +289 -0
  765. package/merged-commands/xlsx.md +289 -0
  766. package/merged-commands/xss-html-injection.md +499 -0
  767. package/merged-commands/youtube-transcript.md +415 -0
  768. package/merged-commands/zapier-make-patterns.md +67 -0
  769. package/merged-commands/zustand-store.md +68 -0
  770. package/package.json +1 -1
  771. package/scripts/generate-index.js +3 -1
  772. package/scripts/merge-commands.js +21 -0
  773. package/skills-index.json +2248 -463
@@ -0,0 +1,856 @@
1
+ ---
2
+ name: fp-ts-errors
3
+ description: Handle errors as values using fp-ts Either and TaskEither for cleaner, more predictable TypeScript code. Use when implementing error handling patterns with fp-ts.
4
+ risk: safe
5
+ source: https://github.com/whatiskadudoing/fp-ts-skills
6
+ ---
7
+
8
+ # Practical Error Handling with fp-ts
9
+
10
+ This skill teaches you how to handle errors without try/catch spaghetti. No academic jargon - just practical patterns for real problems.
11
+
12
+ ## When to Use This Skill
13
+
14
+ - When you want type-safe error handling in TypeScript
15
+ - When replacing try/catch with Either and TaskEither patterns
16
+ - When building APIs or services that need explicit error types
17
+ - When accumulating multiple validation errors
18
+
19
+ The core idea: **Errors are just data**. Instead of throwing them into the void and hoping someone catches them, return them as values that TypeScript can track.
20
+
21
+ ---
22
+
23
+ ## 1. Stop Throwing Everywhere
24
+
25
+ ### The Problem with Exceptions
26
+
27
+ Exceptions are invisible in your types. They break the contract between functions.
28
+
29
+ ```typescript
30
+ // What this function signature promises:
31
+ function getUser(id: string): User
32
+
33
+ // What it actually does:
34
+ function getUser(id: string): User {
35
+ if (!id) throw new Error('ID required')
36
+ const user = db.find(id)
37
+ if (!user) throw new Error('User not found')
38
+ return user
39
+ }
40
+
41
+ // The caller has no idea this can fail
42
+ const user = getUser(id) // Might explode!
43
+ ```
44
+
45
+ You end up with code like this:
46
+
47
+ ```typescript
48
+ // MESSY: try/catch everywhere
49
+ function processOrder(orderId: string) {
50
+ let order
51
+ try {
52
+ order = getOrder(orderId)
53
+ } catch (e) {
54
+ console.error('Failed to get order')
55
+ return null
56
+ }
57
+
58
+ let user
59
+ try {
60
+ user = getUser(order.userId)
61
+ } catch (e) {
62
+ console.error('Failed to get user')
63
+ return null
64
+ }
65
+
66
+ let payment
67
+ try {
68
+ payment = chargeCard(user.cardId, order.total)
69
+ } catch (e) {
70
+ console.error('Payment failed')
71
+ return null
72
+ }
73
+
74
+ return { order, user, payment }
75
+ }
76
+ ```
77
+
78
+ ### The Solution: Return Errors as Values
79
+
80
+ ```typescript
81
+ import * as E from 'fp-ts/Either'
82
+ import { pipe } from 'fp-ts/function'
83
+
84
+ // Now TypeScript KNOWS this can fail
85
+ function getUser(id: string): E.Either<string, User> {
86
+ if (!id) return E.left('ID required')
87
+ const user = db.find(id)
88
+ if (!user) return E.left('User not found')
89
+ return E.right(user)
90
+ }
91
+
92
+ // The caller is forced to handle both cases
93
+ const result = getUser(id)
94
+ // result is Either<string, User> - error OR success, never both
95
+ ```
96
+
97
+ ---
98
+
99
+ ## 2. The Result Pattern (Either)
100
+
101
+ `Either<E, A>` is simple: it holds either an error (`E`) or a value (`A`).
102
+
103
+ - `Left` = error case
104
+ - `Right` = success case (think "right" as in "correct")
105
+
106
+ ```typescript
107
+ import * as E from 'fp-ts/Either'
108
+
109
+ // Creating values
110
+ const success = E.right(42) // Right(42)
111
+ const failure = E.left('Oops') // Left('Oops')
112
+
113
+ // Checking what you have
114
+ if (E.isRight(result)) {
115
+ console.log(result.right) // The success value
116
+ } else {
117
+ console.log(result.left) // The error
118
+ }
119
+
120
+ // Better: pattern match with fold
121
+ const message = pipe(
122
+ result,
123
+ E.fold(
124
+ (error) => `Failed: ${error}`,
125
+ (value) => `Got: ${value}`
126
+ )
127
+ )
128
+ ```
129
+
130
+ ### Converting Throwing Code to Either
131
+
132
+ ```typescript
133
+ // Wrap any throwing function with tryCatch
134
+ const parseJSON = (json: string): E.Either<Error, unknown> =>
135
+ E.tryCatch(
136
+ () => JSON.parse(json),
137
+ (e) => (e instanceof Error ? e : new Error(String(e)))
138
+ )
139
+
140
+ parseJSON('{"valid": true}') // Right({ valid: true })
141
+ parseJSON('not json') // Left(SyntaxError: ...)
142
+
143
+ // For functions you'll reuse, use tryCatchK
144
+ const safeParseJSON = E.tryCatchK(
145
+ JSON.parse,
146
+ (e) => (e instanceof Error ? e : new Error(String(e)))
147
+ )
148
+ ```
149
+
150
+ ### Common Either Operations
151
+
152
+ ```typescript
153
+ import * as E from 'fp-ts/Either'
154
+ import { pipe } from 'fp-ts/function'
155
+
156
+ // Transform the success value
157
+ const doubled = pipe(
158
+ E.right(21),
159
+ E.map(n => n * 2)
160
+ ) // Right(42)
161
+
162
+ // Transform the error
163
+ const betterError = pipe(
164
+ E.left('bad'),
165
+ E.mapLeft(e => `Error: ${e}`)
166
+ ) // Left('Error: bad')
167
+
168
+ // Provide a default for errors
169
+ const value = pipe(
170
+ E.left('failed'),
171
+ E.getOrElse(() => 0)
172
+ ) // 0
173
+
174
+ // Convert nullable to Either
175
+ const fromNullable = E.fromNullable('not found')
176
+ fromNullable(user) // Right(user) if exists, Left('not found') if null/undefined
177
+ ```
178
+
179
+ ---
180
+
181
+ ## 3. Chaining Operations That Might Fail
182
+
183
+ The real power comes from chaining. Each step can fail, but you write it as a clean pipeline.
184
+
185
+ ### Before: Nested Try/Catch Hell
186
+
187
+ ```typescript
188
+ // MESSY: Each step can fail, nested try/catch everywhere
189
+ function processUserOrder(userId: string, productId: string): Result | null {
190
+ let user
191
+ try {
192
+ user = getUser(userId)
193
+ } catch (e) {
194
+ logError('User fetch failed', e)
195
+ return null
196
+ }
197
+
198
+ if (!user.isActive) {
199
+ logError('User not active')
200
+ return null
201
+ }
202
+
203
+ let product
204
+ try {
205
+ product = getProduct(productId)
206
+ } catch (e) {
207
+ logError('Product fetch failed', e)
208
+ return null
209
+ }
210
+
211
+ if (product.stock < 1) {
212
+ logError('Out of stock')
213
+ return null
214
+ }
215
+
216
+ let order
217
+ try {
218
+ order = createOrder(user, product)
219
+ } catch (e) {
220
+ logError('Order creation failed', e)
221
+ return null
222
+ }
223
+
224
+ return order
225
+ }
226
+ ```
227
+
228
+ ### After: Clean Chain with Either
229
+
230
+ ```typescript
231
+ import * as E from 'fp-ts/Either'
232
+ import { pipe } from 'fp-ts/function'
233
+
234
+ // Each function returns Either<Error, T>
235
+ const getUser = (id: string): E.Either<string, User> => { ... }
236
+ const getProduct = (id: string): E.Either<string, Product> => { ... }
237
+ const createOrder = (user: User, product: Product): E.Either<string, Order> => { ... }
238
+
239
+ // Chain them together - first error stops the chain
240
+ const processUserOrder = (userId: string, productId: string): E.Either<string, Order> =>
241
+ pipe(
242
+ getUser(userId),
243
+ E.filterOrElse(
244
+ user => user.isActive,
245
+ () => 'User not active'
246
+ ),
247
+ E.chain(user =>
248
+ pipe(
249
+ getProduct(productId),
250
+ E.filterOrElse(
251
+ product => product.stock >= 1,
252
+ () => 'Out of stock'
253
+ ),
254
+ E.chain(product => createOrder(user, product))
255
+ )
256
+ )
257
+ )
258
+
259
+ // Or use Do notation for cleaner access to intermediate values
260
+ const processUserOrder = (userId: string, productId: string): E.Either<string, Order> =>
261
+ pipe(
262
+ E.Do,
263
+ E.bind('user', () => getUser(userId)),
264
+ E.filterOrElse(
265
+ ({ user }) => user.isActive,
266
+ () => 'User not active'
267
+ ),
268
+ E.bind('product', () => getProduct(productId)),
269
+ E.filterOrElse(
270
+ ({ product }) => product.stock >= 1,
271
+ () => 'Out of stock'
272
+ ),
273
+ E.chain(({ user, product }) => createOrder(user, product))
274
+ )
275
+ ```
276
+
277
+ ### Different Error Types? Use chainW
278
+
279
+ ```typescript
280
+ type ValidationError = { type: 'validation'; message: string }
281
+ type DbError = { type: 'db'; message: string }
282
+
283
+ const validateInput = (id: string): E.Either<ValidationError, string> => { ... }
284
+ const fetchFromDb = (id: string): E.Either<DbError, User> => { ... }
285
+
286
+ // chainW (W = "wider") automatically unions the error types
287
+ const process = (id: string): E.Either<ValidationError | DbError, User> =>
288
+ pipe(
289
+ validateInput(id),
290
+ E.chainW(validId => fetchFromDb(validId))
291
+ )
292
+ ```
293
+
294
+ ---
295
+
296
+ ## 4. Collecting Multiple Errors
297
+
298
+ Sometimes you want ALL errors, not just the first one. Form validation is the classic example.
299
+
300
+ ### Before: Collecting Errors Manually
301
+
302
+ ```typescript
303
+ // MESSY: Manual error accumulation
304
+ function validateForm(form: FormData): { valid: boolean; errors: string[] } {
305
+ const errors: string[] = []
306
+
307
+ if (!form.email) {
308
+ errors.push('Email required')
309
+ } else if (!form.email.includes('@')) {
310
+ errors.push('Invalid email')
311
+ }
312
+
313
+ if (!form.password) {
314
+ errors.push('Password required')
315
+ } else if (form.password.length < 8) {
316
+ errors.push('Password too short')
317
+ }
318
+
319
+ if (!form.age) {
320
+ errors.push('Age required')
321
+ } else if (form.age < 18) {
322
+ errors.push('Must be 18+')
323
+ }
324
+
325
+ return { valid: errors.length === 0, errors }
326
+ }
327
+ ```
328
+
329
+ ### After: Validation with Error Accumulation
330
+
331
+ ```typescript
332
+ import * as E from 'fp-ts/Either'
333
+ import * as NEA from 'fp-ts/NonEmptyArray'
334
+ import { sequenceS } from 'fp-ts/Apply'
335
+ import { pipe } from 'fp-ts/function'
336
+
337
+ // Errors as a NonEmptyArray (always at least one)
338
+ type Errors = NEA.NonEmptyArray<string>
339
+
340
+ // Create the applicative that accumulates errors
341
+ const validation = E.getApplicativeValidation(NEA.getSemigroup<string>())
342
+
343
+ // Validators that return Either<Errors, T>
344
+ const validateEmail = (email: string): E.Either<Errors, string> =>
345
+ !email ? E.left(NEA.of('Email required'))
346
+ : !email.includes('@') ? E.left(NEA.of('Invalid email'))
347
+ : E.right(email)
348
+
349
+ const validatePassword = (password: string): E.Either<Errors, string> =>
350
+ !password ? E.left(NEA.of('Password required'))
351
+ : password.length < 8 ? E.left(NEA.of('Password too short'))
352
+ : E.right(password)
353
+
354
+ const validateAge = (age: number | undefined): E.Either<Errors, number> =>
355
+ age === undefined ? E.left(NEA.of('Age required'))
356
+ : age < 18 ? E.left(NEA.of('Must be 18+'))
357
+ : E.right(age)
358
+
359
+ // Combine all validations - collects ALL errors
360
+ const validateForm = (form: FormData) =>
361
+ sequenceS(validation)({
362
+ email: validateEmail(form.email),
363
+ password: validatePassword(form.password),
364
+ age: validateAge(form.age)
365
+ })
366
+
367
+ // Usage
368
+ validateForm({ email: '', password: '123', age: 15 })
369
+ // Left(['Email required', 'Password too short', 'Must be 18+'])
370
+
371
+ validateForm({ email: 'a@b.com', password: 'longpassword', age: 25 })
372
+ // Right({ email: 'a@b.com', password: 'longpassword', age: 25 })
373
+ ```
374
+
375
+ ### Field-Level Errors for Forms
376
+
377
+ ```typescript
378
+ interface FieldError {
379
+ field: string
380
+ message: string
381
+ }
382
+
383
+ type FormErrors = NEA.NonEmptyArray<FieldError>
384
+
385
+ const fieldError = (field: string, message: string): FormErrors =>
386
+ NEA.of({ field, message })
387
+
388
+ const formValidation = E.getApplicativeValidation(NEA.getSemigroup<FieldError>())
389
+
390
+ // Now errors know which field they belong to
391
+ const validateEmail = (email: string): E.Either<FormErrors, string> =>
392
+ !email ? E.left(fieldError('email', 'Required'))
393
+ : !email.includes('@') ? E.left(fieldError('email', 'Invalid format'))
394
+ : E.right(email)
395
+
396
+ // Easy to display in UI
397
+ const getFieldError = (errors: FormErrors, field: string): string | undefined =>
398
+ errors.find(e => e.field === field)?.message
399
+ ```
400
+
401
+ ---
402
+
403
+ ## 5. Async Operations (TaskEither)
404
+
405
+ For async operations that can fail, use `TaskEither`. It's like `Either` but for promises.
406
+
407
+ - `TaskEither<E, A>` = a function that returns `Promise<Either<E, A>>`
408
+ - Lazy: nothing runs until you execute it
409
+
410
+ ```typescript
411
+ import * as TE from 'fp-ts/TaskEither'
412
+ import { pipe } from 'fp-ts/function'
413
+
414
+ // Wrap any async operation
415
+ const fetchUser = (id: string): TE.TaskEither<Error, User> =>
416
+ TE.tryCatch(
417
+ () => fetch(`/api/users/${id}`).then(r => r.json()),
418
+ (e) => (e instanceof Error ? e : new Error(String(e)))
419
+ )
420
+
421
+ // Chain async operations - just like Either
422
+ const getUserPosts = (userId: string): TE.TaskEither<Error, Post[]> =>
423
+ pipe(
424
+ fetchUser(userId),
425
+ TE.chain(user => fetchPosts(user.id))
426
+ )
427
+
428
+ // Execute when ready
429
+ const result = await getUserPosts('123')() // Returns Either<Error, Post[]>
430
+ ```
431
+
432
+ ### Before: Promise Chain with Error Handling
433
+
434
+ ```typescript
435
+ // MESSY: try/catch mixed with promise chains
436
+ async function loadDashboard(userId: string) {
437
+ try {
438
+ const user = await fetchUser(userId)
439
+ if (!user) throw new Error('User not found')
440
+
441
+ let posts, notifications, settings
442
+ try {
443
+ [posts, notifications, settings] = await Promise.all([
444
+ fetchPosts(user.id),
445
+ fetchNotifications(user.id),
446
+ fetchSettings(user.id)
447
+ ])
448
+ } catch (e) {
449
+ // Which one failed? Who knows!
450
+ console.error('Failed to load data', e)
451
+ return null
452
+ }
453
+
454
+ return { user, posts, notifications, settings }
455
+ } catch (e) {
456
+ console.error('Failed to load user', e)
457
+ return null
458
+ }
459
+ }
460
+ ```
461
+
462
+ ### After: Clean TaskEither Pipeline
463
+
464
+ ```typescript
465
+ import * as TE from 'fp-ts/TaskEither'
466
+ import { sequenceS } from 'fp-ts/Apply'
467
+ import { pipe } from 'fp-ts/function'
468
+
469
+ const loadDashboard = (userId: string) =>
470
+ pipe(
471
+ fetchUser(userId),
472
+ TE.chain(user =>
473
+ pipe(
474
+ // Parallel fetch with sequenceS
475
+ sequenceS(TE.ApplyPar)({
476
+ posts: fetchPosts(user.id),
477
+ notifications: fetchNotifications(user.id),
478
+ settings: fetchSettings(user.id)
479
+ }),
480
+ TE.map(data => ({ user, ...data }))
481
+ )
482
+ )
483
+ )
484
+
485
+ // Execute and handle both cases
486
+ pipe(
487
+ loadDashboard('123'),
488
+ TE.fold(
489
+ (error) => T.of(renderError(error)),
490
+ (data) => T.of(renderDashboard(data))
491
+ )
492
+ )()
493
+ ```
494
+
495
+ ### Retry Failed Operations
496
+
497
+ ```typescript
498
+ import * as T from 'fp-ts/Task'
499
+ import * as TE from 'fp-ts/TaskEither'
500
+ import { pipe } from 'fp-ts/function'
501
+
502
+ const retry = <E, A>(
503
+ task: TE.TaskEither<E, A>,
504
+ attempts: number,
505
+ delayMs: number
506
+ ): TE.TaskEither<E, A> =>
507
+ pipe(
508
+ task,
509
+ TE.orElse((error) =>
510
+ attempts > 1
511
+ ? pipe(
512
+ T.delay(delayMs)(T.of(undefined)),
513
+ T.chain(() => retry(task, attempts - 1, delayMs * 2))
514
+ )
515
+ : TE.left(error)
516
+ )
517
+ )
518
+
519
+ // Retry up to 3 times with exponential backoff
520
+ const fetchWithRetry = retry(fetchUser('123'), 3, 1000)
521
+ ```
522
+
523
+ ### Fallback to Alternative
524
+
525
+ ```typescript
526
+ // Try cache first, fall back to API
527
+ const getUserData = (id: string) =>
528
+ pipe(
529
+ fetchFromCache(id),
530
+ TE.orElse(() => fetchFromApi(id)),
531
+ TE.orElse(() => TE.right(defaultUser)) // Last resort default
532
+ )
533
+ ```
534
+
535
+ ---
536
+
537
+ ## 6. Converting Between Patterns
538
+
539
+ Real codebases have throwing functions, nullable values, and promises. Here's how to work with them.
540
+
541
+ ### From Nullable to Either
542
+
543
+ ```typescript
544
+ import * as E from 'fp-ts/Either'
545
+ import * as O from 'fp-ts/Option'
546
+
547
+ // Direct conversion
548
+ const user = users.find(u => u.id === id) // User | undefined
549
+ const result = E.fromNullable('User not found')(user)
550
+
551
+ // From Option
552
+ const maybeUser: O.Option<User> = O.fromNullable(user)
553
+ const eitherUser = pipe(
554
+ maybeUser,
555
+ E.fromOption(() => 'User not found')
556
+ )
557
+ ```
558
+
559
+ ### From Throwing Function to Either
560
+
561
+ ```typescript
562
+ // Wrap at the boundary
563
+ const safeParse = <T>(schema: ZodSchema<T>) => (data: unknown): E.Either<ZodError, T> =>
564
+ E.tryCatch(
565
+ () => schema.parse(data),
566
+ (e) => e as ZodError
567
+ )
568
+
569
+ // Use throughout your code
570
+ const parseUser = safeParse(UserSchema)
571
+ const result = parseUser(rawData) // Either<ZodError, User>
572
+ ```
573
+
574
+ ### From Promise to TaskEither
575
+
576
+ ```typescript
577
+ import * as TE from 'fp-ts/TaskEither'
578
+
579
+ // Wrap external async functions
580
+ const fetchJson = <T>(url: string): TE.TaskEither<Error, T> =>
581
+ TE.tryCatch(
582
+ () => fetch(url).then(r => r.json()),
583
+ (e) => new Error(`Fetch failed: ${e}`)
584
+ )
585
+
586
+ // Wrap axios, prisma, any async library
587
+ const getUserFromDb = (id: string): TE.TaskEither<DbError, User> =>
588
+ TE.tryCatch(
589
+ () => prisma.user.findUniqueOrThrow({ where: { id } }),
590
+ (e) => ({ code: 'DB_ERROR', cause: e })
591
+ )
592
+ ```
593
+
594
+ ### Back to Promise (Escape Hatch)
595
+
596
+ Sometimes you need a plain Promise for external APIs.
597
+
598
+ ```typescript
599
+ import * as TE from 'fp-ts/TaskEither'
600
+ import * as E from 'fp-ts/Either'
601
+
602
+ const myTaskEither: TE.TaskEither<Error, User> = fetchUser('123')
603
+
604
+ // Option 1: Get the Either (preserves both cases)
605
+ const either: E.Either<Error, User> = await myTaskEither()
606
+
607
+ // Option 2: Throw on error (for legacy code)
608
+ const toThrowingPromise = <E, A>(te: TE.TaskEither<E, A>): Promise<A> =>
609
+ te().then(E.fold(
610
+ (error) => Promise.reject(error),
611
+ (value) => Promise.resolve(value)
612
+ ))
613
+
614
+ const user = await toThrowingPromise(fetchUser('123')) // Throws if Left
615
+
616
+ // Option 3: Default on error
617
+ const user = await pipe(
618
+ fetchUser('123'),
619
+ TE.getOrElse(() => T.of(defaultUser))
620
+ )()
621
+ ```
622
+
623
+ ---
624
+
625
+ ## Real Scenarios
626
+
627
+ ### Parse User Input Safely
628
+
629
+ ```typescript
630
+ interface ParsedInput {
631
+ id: number
632
+ name: string
633
+ tags: string[]
634
+ }
635
+
636
+ const parseInput = (raw: unknown): E.Either<string, ParsedInput> =>
637
+ pipe(
638
+ E.Do,
639
+ E.bind('obj', () =>
640
+ typeof raw === 'object' && raw !== null
641
+ ? E.right(raw as Record<string, unknown>)
642
+ : E.left('Input must be an object')
643
+ ),
644
+ E.bind('id', ({ obj }) =>
645
+ typeof obj.id === 'number'
646
+ ? E.right(obj.id)
647
+ : E.left('id must be a number')
648
+ ),
649
+ E.bind('name', ({ obj }) =>
650
+ typeof obj.name === 'string' && obj.name.length > 0
651
+ ? E.right(obj.name)
652
+ : E.left('name must be a non-empty string')
653
+ ),
654
+ E.bind('tags', ({ obj }) =>
655
+ Array.isArray(obj.tags) && obj.tags.every(t => typeof t === 'string')
656
+ ? E.right(obj.tags as string[])
657
+ : E.left('tags must be an array of strings')
658
+ ),
659
+ E.map(({ id, name, tags }) => ({ id, name, tags }))
660
+ )
661
+
662
+ // Usage
663
+ parseInput({ id: 1, name: 'test', tags: ['a', 'b'] })
664
+ // Right({ id: 1, name: 'test', tags: ['a', 'b'] })
665
+
666
+ parseInput({ id: 'wrong', name: '', tags: null })
667
+ // Left('id must be a number')
668
+ ```
669
+
670
+ ### API Call with Full Error Handling
671
+
672
+ ```typescript
673
+ interface ApiError {
674
+ code: string
675
+ message: string
676
+ status?: number
677
+ }
678
+
679
+ const createApiError = (message: string, code = 'UNKNOWN', status?: number): ApiError =>
680
+ ({ code, message, status })
681
+
682
+ const fetchWithErrorHandling = <T>(url: string): TE.TaskEither<ApiError, T> =>
683
+ pipe(
684
+ TE.tryCatch(
685
+ () => fetch(url),
686
+ () => createApiError('Network error', 'NETWORK')
687
+ ),
688
+ TE.chain(response =>
689
+ response.ok
690
+ ? TE.tryCatch(
691
+ () => response.json() as Promise<T>,
692
+ () => createApiError('Invalid JSON', 'PARSE')
693
+ )
694
+ : TE.left(createApiError(
695
+ `HTTP ${response.status}`,
696
+ response.status === 404 ? 'NOT_FOUND' : 'HTTP_ERROR',
697
+ response.status
698
+ ))
699
+ )
700
+ )
701
+
702
+ // Usage with pattern matching on error codes
703
+ const handleUserFetch = (userId: string) =>
704
+ pipe(
705
+ fetchWithErrorHandling<User>(`/api/users/${userId}`),
706
+ TE.fold(
707
+ (error) => {
708
+ switch (error.code) {
709
+ case 'NOT_FOUND': return T.of(showNotFoundPage())
710
+ case 'NETWORK': return T.of(showOfflineMessage())
711
+ default: return T.of(showGenericError(error.message))
712
+ }
713
+ },
714
+ (user) => T.of(showUserProfile(user))
715
+ )
716
+ )
717
+ ```
718
+
719
+ ### Process List Where Some Items Might Fail
720
+
721
+ ```typescript
722
+ import * as A from 'fp-ts/Array'
723
+ import * as E from 'fp-ts/Either'
724
+ import { pipe } from 'fp-ts/function'
725
+
726
+ interface ProcessResult<T> {
727
+ successes: T[]
728
+ failures: Array<{ item: unknown; error: string }>
729
+ }
730
+
731
+ // Process all, collect successes and failures separately
732
+ const processAllCollectErrors = <T, R>(
733
+ items: T[],
734
+ process: (item: T) => E.Either<string, R>
735
+ ): ProcessResult<R> => {
736
+ const results = items.map((item, index) =>
737
+ pipe(
738
+ process(item),
739
+ E.mapLeft(error => ({ item, error, index }))
740
+ )
741
+ )
742
+
743
+ return {
744
+ successes: pipe(results, A.filterMap(E.toOption)),
745
+ failures: pipe(
746
+ results,
747
+ A.filterMap(r => E.isLeft(r) ? O.some(r.left) : O.none)
748
+ )
749
+ }
750
+ }
751
+
752
+ // Usage
753
+ const parseNumbers = (inputs: string[]) =>
754
+ processAllCollectErrors(inputs, input => {
755
+ const n = parseInt(input, 10)
756
+ return isNaN(n) ? E.left(`Invalid number: ${input}`) : E.right(n)
757
+ })
758
+
759
+ parseNumbers(['1', 'abc', '3', 'def'])
760
+ // {
761
+ // successes: [1, 3],
762
+ // failures: [
763
+ // { item: 'abc', error: 'Invalid number: abc', index: 1 },
764
+ // { item: 'def', error: 'Invalid number: def', index: 3 }
765
+ // ]
766
+ // }
767
+ ```
768
+
769
+ ### Bulk Operations with Partial Success
770
+
771
+ ```typescript
772
+ import * as TE from 'fp-ts/TaskEither'
773
+ import * as T from 'fp-ts/Task'
774
+ import { pipe } from 'fp-ts/function'
775
+
776
+ interface BulkResult<T> {
777
+ succeeded: T[]
778
+ failed: Array<{ id: string; error: string }>
779
+ }
780
+
781
+ const bulkProcess = <T>(
782
+ ids: string[],
783
+ process: (id: string) => TE.TaskEither<string, T>
784
+ ): T.Task<BulkResult<T>> =>
785
+ pipe(
786
+ ids,
787
+ A.map(id =>
788
+ pipe(
789
+ process(id),
790
+ TE.fold(
791
+ (error) => T.of({ type: 'failed' as const, id, error }),
792
+ (result) => T.of({ type: 'succeeded' as const, result })
793
+ )
794
+ )
795
+ ),
796
+ T.sequenceArray,
797
+ T.map(results => ({
798
+ succeeded: results
799
+ .filter((r): r is { type: 'succeeded'; result: T } => r.type === 'succeeded')
800
+ .map(r => r.result),
801
+ failed: results
802
+ .filter((r): r is { type: 'failed'; id: string; error: string } => r.type === 'failed')
803
+ .map(({ id, error }) => ({ id, error }))
804
+ }))
805
+ )
806
+
807
+ // Usage
808
+ const deleteUsers = (userIds: string[]) =>
809
+ bulkProcess(userIds, id =>
810
+ pipe(
811
+ deleteUser(id),
812
+ TE.mapLeft(e => e.message)
813
+ )
814
+ )
815
+
816
+ // All operations run, you get a report of what worked and what didn't
817
+ ```
818
+
819
+ ---
820
+
821
+ ## Quick Reference
822
+
823
+ | Pattern | Use When | Example |
824
+ |---------|----------|---------|
825
+ | `E.right(value)` | Creating a success | `E.right(42)` |
826
+ | `E.left(error)` | Creating a failure | `E.left('not found')` |
827
+ | `E.tryCatch(fn, onError)` | Wrapping throwing code | `E.tryCatch(() => JSON.parse(s), toError)` |
828
+ | `E.fromNullable(error)` | Converting nullable | `E.fromNullable('missing')(maybeValue)` |
829
+ | `E.map(fn)` | Transform success | `pipe(result, E.map(x => x * 2))` |
830
+ | `E.mapLeft(fn)` | Transform error | `pipe(result, E.mapLeft(addContext))` |
831
+ | `E.chain(fn)` | Chain operations | `pipe(getA(), E.chain(a => getB(a.id)))` |
832
+ | `E.chainW(fn)` | Chain with different error type | `pipe(validate(), E.chainW(save))` |
833
+ | `E.fold(onError, onSuccess)` | Handle both cases | `E.fold(showError, showData)` |
834
+ | `E.getOrElse(onError)` | Extract with default | `E.getOrElse(() => 0)` |
835
+ | `E.filterOrElse(pred, onFalse)` | Validate with error | `E.filterOrElse(x => x > 0, () => 'must be positive')` |
836
+ | `sequenceS(validation)({...})` | Collect all errors | Form validation |
837
+
838
+ ### TaskEither Equivalents
839
+
840
+ All Either operations have TaskEither equivalents:
841
+ - `TE.right`, `TE.left`, `TE.tryCatch`
842
+ - `TE.map`, `TE.mapLeft`, `TE.chain`, `TE.chainW`
843
+ - `TE.fold`, `TE.getOrElse`, `TE.filterOrElse`
844
+ - `TE.orElse` for fallbacks
845
+
846
+ ---
847
+
848
+ ## Summary
849
+
850
+ 1. **Return errors as values** - Use Either/TaskEither instead of throwing
851
+ 2. **Chain with confidence** - `chain` stops at first error automatically
852
+ 3. **Collect all errors when needed** - Use validation applicative for forms
853
+ 4. **Wrap at boundaries** - Convert throwing/Promise code at the edges
854
+ 5. **Match at the end** - Use `fold` to handle both cases when you're ready to act
855
+
856
+ The payoff: TypeScript tracks your errors, no more forgotten try/catch, clear control flow, and composable error handling.