cfsa-antigravity 1.0.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 (378) hide show
  1. package/bin/cli.mjs +324 -0
  2. package/package.json +34 -0
  3. package/template/.agent/instructions/commands.md +48 -0
  4. package/template/.agent/instructions/patterns.md +61 -0
  5. package/template/.agent/instructions/structure.md +29 -0
  6. package/template/.agent/instructions/tech-stack.md +43 -0
  7. package/template/.agent/instructions/workflow.md +41 -0
  8. package/template/.agent/kit-sync.md +15 -0
  9. package/template/.agent/rules/boundary-not-placeholder.md +146 -0
  10. package/template/.agent/rules/completion-checklist.md +48 -0
  11. package/template/.agent/rules/decision-classification.md +103 -0
  12. package/template/.agent/rules/extensibility.md +47 -0
  13. package/template/.agent/rules/question-vs-command.md +81 -0
  14. package/template/.agent/rules/security-first.md +43 -0
  15. package/template/.agent/rules/specificity-standards.md +54 -0
  16. package/template/.agent/rules/tdd-contract-first.md +57 -0
  17. package/template/.agent/rules/vertical-slices.md +42 -0
  18. package/template/.agent/skill-library/MANIFEST.md +480 -0
  19. package/template/.agent/skill-library/README.md +38 -0
  20. package/template/.agent/skill-library/meta/brand-guidelines/SKILL.md +73 -0
  21. package/template/.agent/skill-library/meta/claude-code/README.md +9 -0
  22. package/template/.agent/skill-library/meta/claude-code/agent-development/SKILL.md +415 -0
  23. package/template/.agent/skill-library/meta/claude-code/hook-development/SKILL.md +712 -0
  24. package/template/.agent/skill-library/meta/claude-code/plugin-structure/SKILL.md +476 -0
  25. package/template/.agent/skill-library/meta/git-advanced/SKILL.md +972 -0
  26. package/template/.agent/skill-library/meta/mcp-builder/SKILL.md +236 -0
  27. package/template/.agent/skill-library/meta/product-marketing-context/SKILL.md +241 -0
  28. package/template/.agent/skill-library/meta/regex-patterns/SKILL.md +751 -0
  29. package/template/.agent/skill-library/meta/tmux-processes/SKILL.md +210 -0
  30. package/template/.agent/skill-library/meta/using-tmux-for-interactive-commands/SKILL.md +178 -0
  31. package/template/.agent/skill-library/stack/3d/threejs-pro/SKILL.md +300 -0
  32. package/template/.agent/skill-library/stack/ai/ai-sdk/SKILL.md +77 -0
  33. package/template/.agent/skill-library/stack/ai/langchain/SKILL.md +530 -0
  34. package/template/.agent/skill-library/stack/ai/ollama/SKILL.md +321 -0
  35. package/template/.agent/skill-library/stack/ai/openai-sdk/SKILL.md +549 -0
  36. package/template/.agent/skill-library/stack/analytics/google-analytics/SKILL.md +153 -0
  37. package/template/.agent/skill-library/stack/api/graphql/SKILL.md +1061 -0
  38. package/template/.agent/skill-library/stack/api/trpc/SKILL.md +576 -0
  39. package/template/.agent/skill-library/stack/auth/authjs/SKILL.md +569 -0
  40. package/template/.agent/skill-library/stack/auth/clerk/SKILL.md +590 -0
  41. package/template/.agent/skill-library/stack/auth/firebase-auth/SKILL.md +734 -0
  42. package/template/.agent/skill-library/stack/cms/payload-cms/SKILL.md +573 -0
  43. package/template/.agent/skill-library/stack/cms/shopify/SKILL.md +1193 -0
  44. package/template/.agent/skill-library/stack/cms/wordpress/SKILL.md +1104 -0
  45. package/template/.agent/skill-library/stack/css/sass-scss/SKILL.md +1121 -0
  46. package/template/.agent/skill-library/stack/css/tailwind-css-patterns/SKILL.md +863 -0
  47. package/template/.agent/skill-library/stack/css/tailwind-design-system/SKILL.md +490 -0
  48. package/template/.agent/skill-library/stack/css/vanilla-css/SKILL.md +1078 -0
  49. package/template/.agent/skill-library/stack/databases/clickhouse/SKILL.md +311 -0
  50. package/template/.agent/skill-library/stack/databases/influxdb/SKILL.md +280 -0
  51. package/template/.agent/skill-library/stack/databases/lancedb/SKILL.md +415 -0
  52. package/template/.agent/skill-library/stack/databases/mongodb/SKILL.md +1169 -0
  53. package/template/.agent/skill-library/stack/databases/neo4j/SKILL.md +839 -0
  54. package/template/.agent/skill-library/stack/databases/pgvector/SKILL.md +241 -0
  55. package/template/.agent/skill-library/stack/databases/pinecone/SKILL.md +212 -0
  56. package/template/.agent/skill-library/stack/databases/postgresql/SKILL.md +658 -0
  57. package/template/.agent/skill-library/stack/databases/qdrant/SKILL.md +312 -0
  58. package/template/.agent/skill-library/stack/databases/redis/SKILL.md +1079 -0
  59. package/template/.agent/skill-library/stack/databases/spacetimedb/SKILL.md +532 -0
  60. package/template/.agent/skill-library/stack/databases/sqlite/SKILL.md +1132 -0
  61. package/template/.agent/skill-library/stack/databases/supabase/SKILL.md +640 -0
  62. package/template/.agent/skill-library/stack/databases/surrealdb-expert/SKILL.md +945 -0
  63. package/template/.agent/skill-library/stack/databases/timescaledb/SKILL.md +745 -0
  64. package/template/.agent/skill-library/stack/databases/weaviate/SKILL.md +218 -0
  65. package/template/.agent/skill-library/stack/devops/github-actions/SKILL.md +554 -0
  66. package/template/.agent/skill-library/stack/devops/kubernetes/SKILL.md +950 -0
  67. package/template/.agent/skill-library/stack/devops/nginx/SKILL.md +841 -0
  68. package/template/.agent/skill-library/stack/devops/terraform/SKILL.md +860 -0
  69. package/template/.agent/skill-library/stack/email/resend/SKILL.md +391 -0
  70. package/template/.agent/skill-library/stack/engines/godot/SKILL.md +488 -0
  71. package/template/.agent/skill-library/stack/extensions/chrome-extension/SKILL.md +375 -0
  72. package/template/.agent/skill-library/stack/extensions/vscode-extension/SKILL.md +453 -0
  73. package/template/.agent/skill-library/stack/frameworks/astro-framework/SKILL.md +162 -0
  74. package/template/.agent/skill-library/stack/frameworks/electron/SKILL.md +1286 -0
  75. package/template/.agent/skill-library/stack/frameworks/fastapi/SKILL.md +650 -0
  76. package/template/.agent/skill-library/stack/frameworks/hono/SKILL.md +90 -0
  77. package/template/.agent/skill-library/stack/frameworks/nestjs/SKILL.md +878 -0
  78. package/template/.agent/skill-library/stack/frameworks/nextjs/SKILL.md +635 -0
  79. package/template/.agent/skill-library/stack/frameworks/nuxt/SKILL.md +564 -0
  80. package/template/.agent/skill-library/stack/frameworks/sveltekit/SKILL.md +614 -0
  81. package/template/.agent/skill-library/stack/frameworks/tauri/SKILL.md +920 -0
  82. package/template/.agent/skill-library/stack/gamedev/godot/SKILL.md +1032 -0
  83. package/template/.agent/skill-library/stack/gamedev/unity/SKILL.md +1175 -0
  84. package/template/.agent/skill-library/stack/hosting/aws/SKILL.md +467 -0
  85. package/template/.agent/skill-library/stack/hosting/cloudflare/SKILL.md +201 -0
  86. package/template/.agent/skill-library/stack/hosting/docker-expert/SKILL.md +409 -0
  87. package/template/.agent/skill-library/stack/hosting/vercel/SKILL.md +484 -0
  88. package/template/.agent/skill-library/stack/languages/bash-scripting/SKILL.md +773 -0
  89. package/template/.agent/skill-library/stack/languages/c-cpp/SKILL.md +712 -0
  90. package/template/.agent/skill-library/stack/languages/gdscript/SKILL.md +789 -0
  91. package/template/.agent/skill-library/stack/languages/go/SKILL.md +664 -0
  92. package/template/.agent/skill-library/stack/languages/java/SKILL.md +778 -0
  93. package/template/.agent/skill-library/stack/languages/kotlin/SKILL.md +665 -0
  94. package/template/.agent/skill-library/stack/languages/python/SKILL.md +678 -0
  95. package/template/.agent/skill-library/stack/languages/rust/SKILL.md +673 -0
  96. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/SKILL.md +141 -0
  97. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/advanced-generics.md +90 -0
  98. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/branded-types.md +57 -0
  99. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/builder-pattern.md +71 -0
  100. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/common-pitfalls.md +135 -0
  101. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/conditional-types.md +27 -0
  102. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/decorators.md +98 -0
  103. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/discriminated-unions.md +62 -0
  104. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/mapped-types.md +53 -0
  105. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/performance-best-practices.md +104 -0
  106. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/template-literal-types.md +49 -0
  107. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/testing-types.md +112 -0
  108. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/type-guards.md +70 -0
  109. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/type-inference.md +101 -0
  110. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/utility-types.md +98 -0
  111. package/template/.agent/skill-library/stack/languages/vanilla-javascript/SKILL.md +803 -0
  112. package/template/.agent/skill-library/stack/messaging/kafka/SKILL.md +235 -0
  113. package/template/.agent/skill-library/stack/mobile/expo-react-native/SKILL.md +665 -0
  114. package/template/.agent/skill-library/stack/mobile/flutter/SKILL.md +316 -0
  115. package/template/.agent/skill-library/stack/mobile/react-native/SKILL.md +337 -0
  116. package/template/.agent/skill-library/stack/monitoring/posthog/SKILL.md +396 -0
  117. package/template/.agent/skill-library/stack/monitoring/sentry/SKILL.md +509 -0
  118. package/template/.agent/skill-library/stack/observability/datadog/SKILL.md +179 -0
  119. package/template/.agent/skill-library/stack/observability/distributed-tracing/SKILL.md +140 -0
  120. package/template/.agent/skill-library/stack/observability/logging-best-practices/SKILL.md +168 -0
  121. package/template/.agent/skill-library/stack/observability/opentelemetry/SKILL.md +164 -0
  122. package/template/.agent/skill-library/stack/observability/prometheus-grafana/SKILL.md +246 -0
  123. package/template/.agent/skill-library/stack/observability/python-observability/SKILL.md +158 -0
  124. package/template/.agent/skill-library/stack/orm/drizzle-orm/SKILL.md +613 -0
  125. package/template/.agent/skill-library/stack/orm/prisma/SKILL.md +744 -0
  126. package/template/.agent/skill-library/stack/payments/lemonsqueezy/SKILL.md +393 -0
  127. package/template/.agent/skill-library/stack/payments/stripe-integration/SKILL.md +457 -0
  128. package/template/.agent/skill-library/stack/queue/bullmq/SKILL.md +385 -0
  129. package/template/.agent/skill-library/stack/queue/inngest/SKILL.md +438 -0
  130. package/template/.agent/skill-library/stack/realtime/socketio/SKILL.md +595 -0
  131. package/template/.agent/skill-library/stack/search/elasticsearch/SKILL.md +248 -0
  132. package/template/.agent/skill-library/stack/search/meilisearch/SKILL.md +385 -0
  133. package/template/.agent/skill-library/stack/security/crypto-patterns/SKILL.md +437 -0
  134. package/template/.agent/skill-library/stack/security/csp-cors-headers/SKILL.md +588 -0
  135. package/template/.agent/skill-library/stack/security/dependency-auditing/SKILL.md +560 -0
  136. package/template/.agent/skill-library/stack/security/input-sanitization/SKILL.md +430 -0
  137. package/template/.agent/skill-library/stack/security/owasp-web-security/SKILL.md +421 -0
  138. package/template/.agent/skill-library/stack/state/tanstack-query/SKILL.md +637 -0
  139. package/template/.agent/skill-library/stack/state/zustand/SKILL.md +483 -0
  140. package/template/.agent/skill-library/stack/storage/aws-s3/SKILL.md +415 -0
  141. package/template/.agent/skill-library/stack/testing/playwright/SKILL.md +641 -0
  142. package/template/.agent/skill-library/stack/testing/storybook/SKILL.md +923 -0
  143. package/template/.agent/skill-library/stack/testing/testing-library/SKILL.md +872 -0
  144. package/template/.agent/skill-library/stack/testing/vitest/SKILL.md +714 -0
  145. package/template/.agent/skill-library/stack/ui/react-best-practices/SKILL.md +877 -0
  146. package/template/.agent/skill-library/stack/ui/react-composition-patterns/SKILL.md +1107 -0
  147. package/template/.agent/skill-library/stack/ui/react-flow/SKILL.md +425 -0
  148. package/template/.agent/skill-library/stack/ui/shadcn-ui/SKILL.md +703 -0
  149. package/template/.agent/skill-library/surface/api/api-caching/SKILL.md +458 -0
  150. package/template/.agent/skill-library/surface/api/api-documentation-openapi/SKILL.md +697 -0
  151. package/template/.agent/skill-library/surface/api/api-error-handling/SKILL.md +478 -0
  152. package/template/.agent/skill-library/surface/api/api-security-checklist/SKILL.md +147 -0
  153. package/template/.agent/skill-library/surface/api/api-versioning/SKILL.md +420 -0
  154. package/template/.agent/skill-library/surface/api/email-best-practices/SKILL.md +59 -0
  155. package/template/.agent/skill-library/surface/api/rate-limiting-abuse-protection/SKILL.md +147 -0
  156. package/template/.agent/skill-library/surface/api/rest-api-design/SKILL.md +478 -0
  157. package/template/.agent/skill-library/surface/api/webhook-design/SKILL.md +752 -0
  158. package/template/.agent/skill-library/surface/cli/cli-configuration-management/SKILL.md +445 -0
  159. package/template/.agent/skill-library/surface/cli/cli-error-diagnostics/SKILL.md +515 -0
  160. package/template/.agent/skill-library/surface/cli/cli-shell-integration/SKILL.md +479 -0
  161. package/template/.agent/skill-library/surface/cli/cli-ux-design/SKILL.md +477 -0
  162. package/template/.agent/skill-library/surface/desktop/desktop-app-distribution/SKILL.md +416 -0
  163. package/template/.agent/skill-library/surface/desktop/desktop-security-sandboxing/SKILL.md +407 -0
  164. package/template/.agent/skill-library/surface/desktop/desktop-ux-conventions/SKILL.md +361 -0
  165. package/template/.agent/skill-library/surface/desktop/native-os-integration/SKILL.md +563 -0
  166. package/template/.agent/skill-library/surface/extension/browser-extension-patterns/SKILL.md +482 -0
  167. package/template/.agent/skill-library/surface/extension/plugin-architecture-design/SKILL.md +632 -0
  168. package/template/.agent/skill-library/surface/extension/vscode-extension-development/SKILL.md +728 -0
  169. package/template/.agent/skill-library/surface/mobile/app-store-submission/SKILL.md +304 -0
  170. package/template/.agent/skill-library/surface/mobile/mobile-offline-sync/SKILL.md +443 -0
  171. package/template/.agent/skill-library/surface/mobile/mobile-responsive-patterns/SKILL.md +432 -0
  172. package/template/.agent/skill-library/surface/mobile/push-notifications/SKILL.md +495 -0
  173. package/template/.agent/skill-library/surface/web/accessibility-compliance/SKILL.md +827 -0
  174. package/template/.agent/skill-library/surface/web/ai-seo/SKILL.md +398 -0
  175. package/template/.agent/skill-library/surface/web/ai-seo/references/content-patterns.md +285 -0
  176. package/template/.agent/skill-library/surface/web/ai-seo/references/platform-ranking-factors.md +152 -0
  177. package/template/.agent/skill-library/surface/web/analytics-tracking/SKILL.md +309 -0
  178. package/template/.agent/skill-library/surface/web/analytics-tracking/references/event-library.md +260 -0
  179. package/template/.agent/skill-library/surface/web/analytics-tracking/references/ga4-implementation.md +300 -0
  180. package/template/.agent/skill-library/surface/web/analytics-tracking/references/gtm-implementation.md +390 -0
  181. package/template/.agent/skill-library/surface/web/authentication-ui-flows/SKILL.md +530 -0
  182. package/template/.agent/skill-library/surface/web/dark-mode-theming/SKILL.md +516 -0
  183. package/template/.agent/skill-library/surface/web/design-reference-data/SKILL.md +105 -0
  184. package/template/.agent/skill-library/surface/web/design-reference-data/data/charts.csv +26 -0
  185. package/template/.agent/skill-library/surface/web/design-reference-data/data/colors.csv +97 -0
  186. package/template/.agent/skill-library/surface/web/design-reference-data/data/landing.csv +31 -0
  187. package/template/.agent/skill-library/surface/web/design-reference-data/data/styles.csv +59 -0
  188. package/template/.agent/skill-library/surface/web/design-reference-data/data/typography.csv +58 -0
  189. package/template/.agent/skill-library/surface/web/design-reference-data/data/ux-guidelines.csv +100 -0
  190. package/template/.agent/skill-library/surface/web/design-reference-data/scripts/core.py +258 -0
  191. package/template/.agent/skill-library/surface/web/design-reference-data/scripts/design_system.py +1067 -0
  192. package/template/.agent/skill-library/surface/web/design-reference-data/scripts/search.py +106 -0
  193. package/template/.agent/skill-library/surface/web/form-handling-validation/SKILL.md +675 -0
  194. package/template/.agent/skill-library/surface/web/frontend-design/SKILL.md +1393 -0
  195. package/template/.agent/skill-library/surface/web/frontend-design/templates/cppn-hero.tsx +299 -0
  196. package/template/.agent/skill-library/surface/web/frontend-design/templates/wave-hero.tsx +875 -0
  197. package/template/.agent/skill-library/surface/web/frontend-verification/SKILL.md +111 -0
  198. package/template/.agent/skill-library/surface/web/frontend-verification/scripts/ux_audit.py +739 -0
  199. package/template/.agent/skill-library/surface/web/i18n-localization/SKILL.md +154 -0
  200. package/template/.agent/skill-library/surface/web/offline-first-pwa/SKILL.md +657 -0
  201. package/template/.agent/skill-library/surface/web/page-cro/SKILL.md +182 -0
  202. package/template/.agent/skill-library/surface/web/page-cro/references/experiments.md +248 -0
  203. package/template/.agent/skill-library/surface/web/programmatic-seo/SKILL.md +238 -0
  204. package/template/.agent/skill-library/surface/web/programmatic-seo/references/playbooks.md +308 -0
  205. package/template/.agent/skill-library/surface/web/schema-markup/SKILL.md +179 -0
  206. package/template/.agent/skill-library/surface/web/schema-markup/references/schema-examples.md +398 -0
  207. package/template/.agent/skill-library/surface/web/seo-audit/SKILL.md +394 -0
  208. package/template/.agent/skill-library/surface/web/seo-audit/references/ai-writing-detection.md +200 -0
  209. package/template/.agent/skill-library/surface/web/web-performance-optimization/SKILL.md +646 -0
  210. package/template/.agent/skill-library/surface/web/web-scraping/SKILL.md +58 -0
  211. package/template/.agent/skills/accessibility/SKILL.md +522 -0
  212. package/template/.agent/skills/accessibility/references/WCAG.md +162 -0
  213. package/template/.agent/skills/adversarial-review/SKILL.md +90 -0
  214. package/template/.agent/skills/antigravity-workflows/SKILL.md +81 -0
  215. package/template/.agent/skills/antigravity-workflows/resources/implementation-playbook.md +36 -0
  216. package/template/.agent/skills/api-design-principles/SKILL.md +37 -0
  217. package/template/.agent/skills/api-design-principles/assets/api-design-checklist.md +155 -0
  218. package/template/.agent/skills/api-design-principles/assets/rest-api-template.py +182 -0
  219. package/template/.agent/skills/api-design-principles/references/graphql-schema-design.md +583 -0
  220. package/template/.agent/skills/api-design-principles/references/rest-best-practices.md +408 -0
  221. package/template/.agent/skills/api-design-principles/resources/implementation-playbook.md +513 -0
  222. package/template/.agent/skills/api-versioning/SKILL.md +420 -0
  223. package/template/.agent/skills/architecture-mapping/SKILL.md +219 -0
  224. package/template/.agent/skills/bootstrap-agents/SKILL.md +259 -0
  225. package/template/.agent/skills/brainstorming/SKILL.md +236 -0
  226. package/template/.agent/skills/brand-guidelines/SKILL.md +44 -0
  227. package/template/.agent/skills/clean-code/SKILL.md +94 -0
  228. package/template/.agent/skills/code-review-pro/SKILL.md +152 -0
  229. package/template/.agent/skills/concise-planning/SKILL.md +68 -0
  230. package/template/.agent/skills/cross-layer-consistency/SKILL.md +117 -0
  231. package/template/.agent/skills/database-schema-design/SKILL.md +429 -0
  232. package/template/.agent/skills/deployment-procedures/SKILL.md +241 -0
  233. package/template/.agent/skills/design-anti-cliche/SKILL.md +159 -0
  234. package/template/.agent/skills/design-direction/SKILL.md +45 -0
  235. package/template/.agent/skills/error-handling-patterns/SKILL.md +721 -0
  236. package/template/.agent/skills/find-skills/SKILL.md +145 -0
  237. package/template/.agent/skills/git-advanced/SKILL.md +972 -0
  238. package/template/.agent/skills/git-workflow/SKILL.md +420 -0
  239. package/template/.agent/skills/idea-extraction/SKILL.md +271 -0
  240. package/template/.agent/skills/logging-best-practices/SKILL.md +851 -0
  241. package/template/.agent/skills/migration-management/SKILL.md +384 -0
  242. package/template/.agent/skills/minimalist-surgical-development/SKILL.md +69 -0
  243. package/template/.agent/skills/parallel-agents/SKILL.md +165 -0
  244. package/template/.agent/skills/parallel-debugging/SKILL.md +135 -0
  245. package/template/.agent/skills/parallel-feature-development/SKILL.md +166 -0
  246. package/template/.agent/skills/performance-budgeting/SKILL.md +144 -0
  247. package/template/.agent/skills/pipeline-rubrics/SKILL.md +51 -0
  248. package/template/.agent/skills/pipeline-rubrics/references/architecture-rubric.md +19 -0
  249. package/template/.agent/skills/pipeline-rubrics/references/be-rubric.md +21 -0
  250. package/template/.agent/skills/pipeline-rubrics/references/fe-rubric.md +20 -0
  251. package/template/.agent/skills/pipeline-rubrics/references/ia-rubric.md +19 -0
  252. package/template/.agent/skills/pipeline-rubrics/references/scoring.md +28 -0
  253. package/template/.agent/skills/pipeline-rubrics/references/vision-rubric.md +11 -0
  254. package/template/.agent/skills/prd-templates/SKILL.md +88 -0
  255. package/template/.agent/skills/prd-templates/references/architecture-design-template.md +88 -0
  256. package/template/.agent/skills/prd-templates/references/be-spec-template.md +101 -0
  257. package/template/.agent/skills/prd-templates/references/data-placement-template.md +74 -0
  258. package/template/.agent/skills/prd-templates/references/decomposition-templates.md +211 -0
  259. package/template/.agent/skills/prd-templates/references/design-system-decisions.md +198 -0
  260. package/template/.agent/skills/prd-templates/references/engineering-standards-template.md +124 -0
  261. package/template/.agent/skills/prd-templates/references/fe-classification-procedures.md +47 -0
  262. package/template/.agent/skills/prd-templates/references/fe-spec-template.md +84 -0
  263. package/template/.agent/skills/prd-templates/references/infrastructure-report-template.md +71 -0
  264. package/template/.agent/skills/prd-templates/references/operational-templates.md +116 -0
  265. package/template/.agent/skills/prd-templates/references/placeholder-guard-template.md +21 -0
  266. package/template/.agent/skills/prd-templates/references/surface-model.md +61 -0
  267. package/template/.agent/skills/prd-templates/references/vision-template.md +66 -0
  268. package/template/.agent/skills/prompt-engineer/README.md +659 -0
  269. package/template/.agent/skills/prompt-engineer/SKILL.md +249 -0
  270. package/template/.agent/skills/regex-patterns/SKILL.md +751 -0
  271. package/template/.agent/skills/resolve-ambiguity/SKILL.md +278 -0
  272. package/template/.agent/skills/rest-api-design/SKILL.md +478 -0
  273. package/template/.agent/skills/security-scanning-security-hardening/SKILL.md +231 -0
  274. package/template/.agent/skills/session-continuity/SKILL.md +730 -0
  275. package/template/.agent/skills/session-continuity/protocols/01-session-resumption.md +38 -0
  276. package/template/.agent/skills/session-continuity/protocols/02-progress-generation.md +85 -0
  277. package/template/.agent/skills/session-continuity/protocols/03-progress-update.md +70 -0
  278. package/template/.agent/skills/session-continuity/protocols/04-pattern-extraction.md +60 -0
  279. package/template/.agent/skills/session-continuity/protocols/05-session-close.md +37 -0
  280. package/template/.agent/skills/session-continuity/protocols/06-decision-analysis.md +84 -0
  281. package/template/.agent/skills/session-continuity/protocols/07-spec-pipeline-generation.md +48 -0
  282. package/template/.agent/skills/session-continuity/protocols/08-spec-pipeline-update.md +43 -0
  283. package/template/.agent/skills/session-continuity/protocols/09-parallel-claim.md +122 -0
  284. package/template/.agent/skills/session-continuity/protocols/10-placeholder-verification-gate.md +104 -0
  285. package/template/.agent/skills/session-continuity/protocols/ambiguity-gates.md +48 -0
  286. package/template/.agent/skills/skill-creator/LICENSE.txt +202 -0
  287. package/template/.agent/skills/skill-creator/README.md +270 -0
  288. package/template/.agent/skills/skill-creator/SKILL.md +590 -0
  289. package/template/.agent/skills/skill-creator/references/output-patterns.md +82 -0
  290. package/template/.agent/skills/skill-creator/references/workflows.md +28 -0
  291. package/template/.agent/skills/skill-creator/scripts/init_skill.py +303 -0
  292. package/template/.agent/skills/skill-creator/scripts/package_skill.py +110 -0
  293. package/template/.agent/skills/skill-creator/scripts/quick_validate.py +95 -0
  294. package/template/.agent/skills/spec-writing/SKILL.md +110 -0
  295. package/template/.agent/skills/systematic-debugging/CREATION-LOG.md +119 -0
  296. package/template/.agent/skills/systematic-debugging/SKILL.md +297 -0
  297. package/template/.agent/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
  298. package/template/.agent/skills/systematic-debugging/condition-based-waiting.md +115 -0
  299. package/template/.agent/skills/systematic-debugging/defense-in-depth.md +122 -0
  300. package/template/.agent/skills/systematic-debugging/find-polluter.sh +63 -0
  301. package/template/.agent/skills/systematic-debugging/root-cause-tracing.md +169 -0
  302. package/template/.agent/skills/systematic-debugging/test-academic.md +14 -0
  303. package/template/.agent/skills/systematic-debugging/test-pressure-1.md +58 -0
  304. package/template/.agent/skills/systematic-debugging/test-pressure-2.md +68 -0
  305. package/template/.agent/skills/systematic-debugging/test-pressure-3.md +69 -0
  306. package/template/.agent/skills/tdd-workflow/SKILL.md +409 -0
  307. package/template/.agent/skills/tech-stack-catalog/SKILL.md +49 -0
  308. package/template/.agent/skills/tech-stack-catalog/references/constraint-questions.md +21 -0
  309. package/template/.agent/skills/tech-stack-catalog/references/dev-tooling-decisions.md +37 -0
  310. package/template/.agent/skills/tech-stack-catalog/references/surface-decision-tables.md +69 -0
  311. package/template/.agent/skills/technical-writer/SKILL.md +242 -0
  312. package/template/.agent/skills/testing-strategist/SKILL.md +932 -0
  313. package/template/.agent/skills/verification-before-completion/SKILL.md +145 -0
  314. package/template/.agent/skills/workflow-automation/SKILL.md +73 -0
  315. package/template/.agent/workflows/audit-ambiguity-execute.md +165 -0
  316. package/template/.agent/workflows/audit-ambiguity-rubrics.md +83 -0
  317. package/template/.agent/workflows/audit-ambiguity.md +64 -0
  318. package/template/.agent/workflows/bootstrap-agents-fill.md +201 -0
  319. package/template/.agent/workflows/bootstrap-agents-provision.md +197 -0
  320. package/template/.agent/workflows/bootstrap-agents.md +66 -0
  321. package/template/.agent/workflows/create-prd-architecture.md +119 -0
  322. package/template/.agent/workflows/create-prd-compile.md +138 -0
  323. package/template/.agent/workflows/create-prd-design-system.md +135 -0
  324. package/template/.agent/workflows/create-prd-security.md +113 -0
  325. package/template/.agent/workflows/create-prd-stack.md +91 -0
  326. package/template/.agent/workflows/create-prd.md +168 -0
  327. package/template/.agent/workflows/decompose-architecture-structure.md +82 -0
  328. package/template/.agent/workflows/decompose-architecture-validate.md +119 -0
  329. package/template/.agent/workflows/decompose-architecture.md +111 -0
  330. package/template/.agent/workflows/evolve-contract.md +98 -0
  331. package/template/.agent/workflows/evolve-feature-cascade.md +140 -0
  332. package/template/.agent/workflows/evolve-feature-classify.md +116 -0
  333. package/template/.agent/workflows/evolve-feature.md +56 -0
  334. package/template/.agent/workflows/ideate-discover.md +144 -0
  335. package/template/.agent/workflows/ideate-extract.md +129 -0
  336. package/template/.agent/workflows/ideate-validate.md +117 -0
  337. package/template/.agent/workflows/ideate.md +113 -0
  338. package/template/.agent/workflows/implement-slice-setup.md +113 -0
  339. package/template/.agent/workflows/implement-slice-tdd.md +198 -0
  340. package/template/.agent/workflows/implement-slice.md +50 -0
  341. package/template/.agent/workflows/plan-phase.md +202 -0
  342. package/template/.agent/workflows/propagate-decision-apply.md +135 -0
  343. package/template/.agent/workflows/propagate-decision-scan.md +147 -0
  344. package/template/.agent/workflows/propagate-decision.md +56 -0
  345. package/template/.agent/workflows/remediate-pipeline-assess.md +138 -0
  346. package/template/.agent/workflows/remediate-pipeline-execute.md +135 -0
  347. package/template/.agent/workflows/remediate-pipeline.md +55 -0
  348. package/template/.agent/workflows/resolve-ambiguity.md +82 -0
  349. package/template/.agent/workflows/sync-kit.md +209 -0
  350. package/template/.agent/workflows/update-architecture-map.md +74 -0
  351. package/template/.agent/workflows/validate-phase.md +219 -0
  352. package/template/.agent/workflows/verify-infrastructure.md +207 -0
  353. package/template/.agent/workflows/write-architecture-spec-deepen.md +139 -0
  354. package/template/.agent/workflows/write-architecture-spec-design.md +202 -0
  355. package/template/.agent/workflows/write-architecture-spec.md +63 -0
  356. package/template/.agent/workflows/write-be-spec-classify.md +165 -0
  357. package/template/.agent/workflows/write-be-spec-write.md +98 -0
  358. package/template/.agent/workflows/write-be-spec.md +76 -0
  359. package/template/.agent/workflows/write-fe-spec-classify.md +170 -0
  360. package/template/.agent/workflows/write-fe-spec-write.md +94 -0
  361. package/template/.agent/workflows/write-fe-spec.md +71 -0
  362. package/template/AGENTS.md +176 -0
  363. package/template/GEMINI.md +177 -0
  364. package/template/docs/README.md +187 -0
  365. package/template/docs/audits/.gitkeep +0 -0
  366. package/template/docs/audits/README.md +10 -0
  367. package/template/docs/plans/.gitkeep +0 -0
  368. package/template/docs/plans/README.md +21 -0
  369. package/template/docs/plans/be/.gitkeep +0 -0
  370. package/template/docs/plans/be/README.md +11 -0
  371. package/template/docs/plans/fe/.gitkeep +0 -0
  372. package/template/docs/plans/fe/README.md +11 -0
  373. package/template/docs/plans/ia/.gitkeep +0 -0
  374. package/template/docs/plans/ia/README.md +17 -0
  375. package/template/docs/plans/ia/deep-dives/.gitkeep +0 -0
  376. package/template/docs/plans/ia/deep-dives/README.md +5 -0
  377. package/template/docs/plans/phases/.gitkeep +0 -0
  378. package/template/docs/plans/phases/README.md +11 -0
@@ -0,0 +1,576 @@
1
+ ---
2
+ name: trpc
3
+ description: Comprehensive tRPC skill covering router definition, procedures (query, mutation, subscription), input validation with Zod, context, middleware, error handling, client setup, batching, React Query integration, SSR, inference helpers, and testing. Use when building end-to-end typesafe APIs with tRPC.
4
+ version: 1.0.0
5
+ ---
6
+
7
+ # tRPC
8
+
9
+ End-to-end typesafe APIs for TypeScript. Define procedures on the server, call them from the client with full type inference -- no code generation, no runtime overhead.
10
+
11
+ ## Server Setup
12
+
13
+ ### Initialize tRPC
14
+
15
+ ```typescript
16
+ // src/server/trpc.ts
17
+ import { initTRPC, TRPCError } from '@trpc/server';
18
+ import superjson from 'superjson';
19
+ import { ZodError } from 'zod';
20
+
21
+ export interface Context {
22
+ user: { id: string; role: 'admin' | 'user' } | null;
23
+ db: DatabaseClient;
24
+ }
25
+
26
+ const t = initTRPC.context<Context>().create({
27
+ transformer: superjson, // enables Date, Map, Set serialization
28
+ errorFormatter({ shape, error }) {
29
+ return {
30
+ ...shape,
31
+ data: {
32
+ ...shape.data,
33
+ zodError:
34
+ error.cause instanceof ZodError ? error.cause.flatten() : null,
35
+ },
36
+ };
37
+ },
38
+ });
39
+
40
+ export const router = t.router;
41
+ export const publicProcedure = t.procedure;
42
+ export const middleware = t.middleware;
43
+ export const createCallerFactory = t.createCallerFactory;
44
+ ```
45
+
46
+ ### Context Creation
47
+
48
+ ```typescript
49
+ // src/server/context.ts
50
+ import type { CreateNextContextOptions } from '@trpc/server/adapters/next';
51
+ import type { Context } from './trpc';
52
+ import { db } from './db';
53
+ import { verifyToken } from './auth';
54
+
55
+ export async function createContext(opts: CreateNextContextOptions): Promise<Context> {
56
+ const token = opts.req.headers.authorization?.replace('Bearer ', '');
57
+ const user = token ? await verifyToken(token) : null;
58
+
59
+ return { user, db };
60
+ }
61
+ ```
62
+
63
+ ## Router Definition
64
+
65
+ ### Basic Router
66
+
67
+ ```typescript
68
+ // src/server/routers/post.ts
69
+ import { z } from 'zod';
70
+ import { router, publicProcedure, protectedProcedure } from '../trpc';
71
+ import { TRPCError } from '@trpc/server';
72
+
73
+ export const postRouter = router({
74
+ list: publicProcedure
75
+ .input(
76
+ z.object({
77
+ page: z.number().int().min(1).default(1),
78
+ perPage: z.number().int().min(1).max(100).default(20),
79
+ search: z.string().max(100).optional(),
80
+ })
81
+ )
82
+ .query(async ({ input, ctx }) => {
83
+ const { page, perPage, search } = input;
84
+ const offset = (page - 1) * perPage;
85
+
86
+ const [posts, total] = await Promise.all([
87
+ ctx.db.post.findMany({
88
+ where: search ? { title: { contains: search } } : undefined,
89
+ skip: offset,
90
+ take: perPage,
91
+ orderBy: { createdAt: 'desc' },
92
+ }),
93
+ ctx.db.post.count({
94
+ where: search ? { title: { contains: search } } : undefined,
95
+ }),
96
+ ]);
97
+
98
+ return { posts, total, page, perPage };
99
+ }),
100
+
101
+ byId: publicProcedure
102
+ .input(z.object({ id: z.string().uuid() }))
103
+ .query(async ({ input, ctx }) => {
104
+ const post = await ctx.db.post.findUnique({ where: { id: input.id } });
105
+ if (!post) {
106
+ throw new TRPCError({ code: 'NOT_FOUND', message: 'Post not found' });
107
+ }
108
+ return post;
109
+ }),
110
+
111
+ create: protectedProcedure
112
+ .input(
113
+ z.object({
114
+ title: z.string().min(1).max(200),
115
+ content: z.string().min(1).max(50000),
116
+ published: z.boolean().default(false),
117
+ })
118
+ )
119
+ .mutation(async ({ input, ctx }) => {
120
+ return ctx.db.post.create({
121
+ data: { ...input, authorId: ctx.user.id },
122
+ });
123
+ }),
124
+
125
+ update: protectedProcedure
126
+ .input(
127
+ z.object({
128
+ id: z.string().uuid(),
129
+ title: z.string().min(1).max(200).optional(),
130
+ content: z.string().min(1).max(50000).optional(),
131
+ published: z.boolean().optional(),
132
+ })
133
+ )
134
+ .mutation(async ({ input, ctx }) => {
135
+ const { id, ...data } = input;
136
+ const post = await ctx.db.post.findUnique({ where: { id } });
137
+
138
+ if (!post) {
139
+ throw new TRPCError({ code: 'NOT_FOUND' });
140
+ }
141
+ if (post.authorId !== ctx.user.id && ctx.user.role !== 'admin') {
142
+ throw new TRPCError({ code: 'FORBIDDEN' });
143
+ }
144
+
145
+ return ctx.db.post.update({ where: { id }, data });
146
+ }),
147
+
148
+ delete: protectedProcedure
149
+ .input(z.object({ id: z.string().uuid() }))
150
+ .mutation(async ({ input, ctx }) => {
151
+ const post = await ctx.db.post.findUnique({ where: { id: input.id } });
152
+
153
+ if (!post) {
154
+ throw new TRPCError({ code: 'NOT_FOUND' });
155
+ }
156
+ if (post.authorId !== ctx.user.id && ctx.user.role !== 'admin') {
157
+ throw new TRPCError({ code: 'FORBIDDEN' });
158
+ }
159
+
160
+ await ctx.db.post.delete({ where: { id: input.id } });
161
+ return { success: true };
162
+ }),
163
+ });
164
+ ```
165
+
166
+ ### Root Router
167
+
168
+ ```typescript
169
+ // src/server/routers/_app.ts
170
+ import { router } from '../trpc';
171
+ import { postRouter } from './post';
172
+ import { userRouter } from './user';
173
+
174
+ export const appRouter = router({
175
+ post: postRouter,
176
+ user: userRouter,
177
+ });
178
+
179
+ export type AppRouter = typeof appRouter;
180
+ ```
181
+
182
+ ## Middleware
183
+
184
+ ### Authentication Middleware
185
+
186
+ ```typescript
187
+ // src/server/trpc.ts
188
+ const isAuthed = middleware(async ({ ctx, next }) => {
189
+ if (!ctx.user) {
190
+ throw new TRPCError({ code: 'UNAUTHORIZED', message: 'Not authenticated' });
191
+ }
192
+ return next({
193
+ ctx: {
194
+ user: ctx.user, // user is now non-nullable in downstream procedures
195
+ },
196
+ });
197
+ });
198
+
199
+ export const protectedProcedure = publicProcedure.use(isAuthed);
200
+ ```
201
+
202
+ ### Role-Based Access
203
+
204
+ ```typescript
205
+ const requireRole = (role: 'admin' | 'user') =>
206
+ middleware(async ({ ctx, next }) => {
207
+ if (!ctx.user) {
208
+ throw new TRPCError({ code: 'UNAUTHORIZED' });
209
+ }
210
+ if (ctx.user.role !== role && ctx.user.role !== 'admin') {
211
+ throw new TRPCError({ code: 'FORBIDDEN', message: `Requires ${role} role` });
212
+ }
213
+ return next({ ctx: { user: ctx.user } });
214
+ });
215
+
216
+ export const adminProcedure = publicProcedure.use(requireRole('admin'));
217
+ ```
218
+
219
+ ### Logging Middleware
220
+
221
+ ```typescript
222
+ const logger = middleware(async ({ path, type, next }) => {
223
+ const start = performance.now();
224
+ const result = await next();
225
+ const duration = performance.now() - start;
226
+
227
+ if (result.ok) {
228
+ console.log(`[${type}] ${path} - OK - ${duration.toFixed(0)}ms`);
229
+ } else {
230
+ console.error(`[${type}] ${path} - ERROR - ${duration.toFixed(0)}ms`);
231
+ }
232
+
233
+ return result;
234
+ });
235
+
236
+ // Apply to all procedures
237
+ export const publicProcedure = t.procedure.use(logger);
238
+ ```
239
+
240
+ ## Client Setup
241
+
242
+ ### Next.js App Router Integration
243
+
244
+ ```typescript
245
+ // src/trpc/server.ts — server-side caller
246
+ import { createCallerFactory } from '../server/trpc';
247
+ import { appRouter } from '../server/routers/_app';
248
+ import { createContext } from '../server/context';
249
+
250
+ const createCaller = createCallerFactory(appRouter);
251
+
252
+ export async function getServerCaller() {
253
+ const ctx = await createContext();
254
+ return createCaller(ctx);
255
+ }
256
+
257
+ // Usage in Server Component:
258
+ // const trpc = await getServerCaller();
259
+ // const posts = await trpc.post.list({ page: 1 });
260
+ ```
261
+
262
+ ### React Client Setup
263
+
264
+ ```typescript
265
+ // src/trpc/client.ts
266
+ import { createTRPCReact } from '@trpc/react-query';
267
+ import type { AppRouter } from '../server/routers/_app';
268
+
269
+ export const trpc = createTRPCReact<AppRouter>();
270
+ ```
271
+
272
+ ```typescript
273
+ // src/trpc/provider.tsx
274
+ 'use client';
275
+
276
+ import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
277
+ import { httpBatchLink, loggerLink } from '@trpc/client';
278
+ import { trpc } from './client';
279
+ import superjson from 'superjson';
280
+ import { useState } from 'react';
281
+
282
+ export function TRPCProvider({ children }: { children: React.ReactNode }) {
283
+ const [queryClient] = useState(
284
+ () =>
285
+ new QueryClient({
286
+ defaultOptions: {
287
+ queries: {
288
+ staleTime: 5 * 60 * 1000,
289
+ refetchOnWindowFocus: false,
290
+ },
291
+ },
292
+ })
293
+ );
294
+
295
+ const [trpcClient] = useState(() =>
296
+ trpc.createClient({
297
+ links: [
298
+ loggerLink({ enabled: () => process.env.NODE_ENV === 'development' }),
299
+ httpBatchLink({
300
+ url: '/api/trpc',
301
+ transformer: superjson,
302
+ headers() {
303
+ return {
304
+ // Add auth headers here
305
+ };
306
+ },
307
+ }),
308
+ ],
309
+ })
310
+ );
311
+
312
+ return (
313
+ <trpc.Provider client={trpcClient} queryClient={queryClient}>
314
+ <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
315
+ </trpc.Provider>
316
+ );
317
+ }
318
+ ```
319
+
320
+ ### API Handler (Next.js App Router)
321
+
322
+ ```typescript
323
+ // app/api/trpc/[trpc]/route.ts
324
+ import { fetchRequestHandler } from '@trpc/server/adapters/fetch';
325
+ import { appRouter } from '@/server/routers/_app';
326
+ import { createContext } from '@/server/context';
327
+
328
+ const handler = (req: Request) =>
329
+ fetchRequestHandler({
330
+ endpoint: '/api/trpc',
331
+ req,
332
+ router: appRouter,
333
+ createContext: () => createContext(req),
334
+ });
335
+
336
+ export { handler as GET, handler as POST };
337
+ ```
338
+
339
+ ## Client Usage (React)
340
+
341
+ ### Queries
342
+
343
+ ```typescript
344
+ 'use client';
345
+
346
+ import { trpc } from '@/trpc/client';
347
+
348
+ function PostList() {
349
+ const { data, isLoading, error } = trpc.post.list.useQuery({
350
+ page: 1,
351
+ perPage: 10,
352
+ });
353
+
354
+ if (isLoading) return <div>Loading...</div>;
355
+ if (error) return <div>Error: {error.message}</div>;
356
+
357
+ return (
358
+ <ul>
359
+ {data.posts.map((post) => (
360
+ <li key={post.id}>{post.title}</li>
361
+ ))}
362
+ </ul>
363
+ );
364
+ }
365
+ ```
366
+
367
+ ### Mutations
368
+
369
+ ```typescript
370
+ function CreatePostForm() {
371
+ const utils = trpc.useUtils();
372
+
373
+ const createPost = trpc.post.create.useMutation({
374
+ onSuccess() {
375
+ // Invalidate the list query to refetch
376
+ utils.post.list.invalidate();
377
+ },
378
+ onError(error) {
379
+ if (error.data?.zodError) {
380
+ // Handle validation errors
381
+ const fieldErrors = error.data.zodError.fieldErrors;
382
+ console.log(fieldErrors);
383
+ }
384
+ },
385
+ });
386
+
387
+ function handleSubmit(e: React.FormEvent<HTMLFormElement>) {
388
+ e.preventDefault();
389
+ const formData = new FormData(e.currentTarget);
390
+ createPost.mutate({
391
+ title: formData.get('title') as string,
392
+ content: formData.get('content') as string,
393
+ });
394
+ }
395
+
396
+ return (
397
+ <form onSubmit={handleSubmit}>
398
+ <input name="title" required />
399
+ <textarea name="content" required />
400
+ <button type="submit" disabled={createPost.isPending}>
401
+ {createPost.isPending ? 'Creating...' : 'Create Post'}
402
+ </button>
403
+ </form>
404
+ );
405
+ }
406
+ ```
407
+
408
+ ### Optimistic Updates
409
+
410
+ ```typescript
411
+ const deletePost = trpc.post.delete.useMutation({
412
+ onMutate: async ({ id }) => {
413
+ await utils.post.list.cancel();
414
+ const previousData = utils.post.list.getData({ page: 1 });
415
+
416
+ utils.post.list.setData({ page: 1 }, (old) => {
417
+ if (!old) return old;
418
+ return {
419
+ ...old,
420
+ posts: old.posts.filter((p) => p.id !== id),
421
+ total: old.total - 1,
422
+ };
423
+ });
424
+
425
+ return { previousData };
426
+ },
427
+ onError: (_err, _vars, context) => {
428
+ if (context?.previousData) {
429
+ utils.post.list.setData({ page: 1 }, context.previousData);
430
+ }
431
+ },
432
+ onSettled: () => {
433
+ utils.post.list.invalidate();
434
+ },
435
+ });
436
+ ```
437
+
438
+ ## Subscriptions (WebSocket)
439
+
440
+ ```typescript
441
+ // Server
442
+ import { observable } from '@trpc/server/observable';
443
+
444
+ export const chatRouter = router({
445
+ onMessage: publicProcedure
446
+ .input(z.object({ roomId: z.string() }))
447
+ .subscription(({ input }) => {
448
+ return observable<{ text: string; userId: string }>((emit) => {
449
+ const handler = (message: ChatMessage) => {
450
+ if (message.roomId === input.roomId) {
451
+ emit.next({ text: message.text, userId: message.userId });
452
+ }
453
+ };
454
+ chatEmitter.on('message', handler);
455
+ return () => chatEmitter.off('message', handler);
456
+ });
457
+ }),
458
+ });
459
+
460
+ // Client (requires wsLink instead of httpBatchLink)
461
+ import { wsLink, createWSClient } from '@trpc/client';
462
+
463
+ const wsClient = createWSClient({ url: 'ws://localhost:3001' });
464
+
465
+ // In component
466
+ trpc.chat.onMessage.useSubscription(
467
+ { roomId: 'room-1' },
468
+ {
469
+ onData(message) {
470
+ setMessages((prev) => [...prev, message]);
471
+ },
472
+ onError(err) {
473
+ console.error('Subscription error:', err);
474
+ },
475
+ }
476
+ );
477
+ ```
478
+
479
+ ## Type Inference Helpers
480
+
481
+ ```typescript
482
+ import type { inferRouterInputs, inferRouterOutputs } from '@trpc/server';
483
+ import type { AppRouter } from './server/routers/_app';
484
+
485
+ // Infer input/output types from the router
486
+ type RouterInputs = inferRouterInputs<AppRouter>;
487
+ type RouterOutputs = inferRouterOutputs<AppRouter>;
488
+
489
+ // Use in components or utilities
490
+ type PostListInput = RouterInputs['post']['list'];
491
+ type PostListOutput = RouterOutputs['post']['list'];
492
+ type Post = RouterOutputs['post']['byId'];
493
+ ```
494
+
495
+ ## Testing
496
+
497
+ ```typescript
498
+ // tests/post.test.ts
499
+ import { describe, it, expect, beforeEach } from 'vitest';
500
+ import { createCallerFactory } from '../src/server/trpc';
501
+ import { appRouter } from '../src/server/routers/_app';
502
+ import { createTestContext } from './helpers';
503
+
504
+ const createCaller = createCallerFactory(appRouter);
505
+
506
+ describe('post router', () => {
507
+ let caller: ReturnType<typeof createCaller>;
508
+ let authedCaller: ReturnType<typeof createCaller>;
509
+
510
+ beforeEach(async () => {
511
+ const ctx = await createTestContext({ user: null });
512
+ caller = createCaller(ctx);
513
+
514
+ const authedCtx = await createTestContext({
515
+ user: { id: 'user-1', role: 'user' },
516
+ });
517
+ authedCaller = createCaller(authedCtx);
518
+ });
519
+
520
+ it('lists posts without authentication', async () => {
521
+ const result = await caller.post.list({ page: 1 });
522
+ expect(result.posts).toBeDefined();
523
+ expect(result.total).toBeGreaterThanOrEqual(0);
524
+ });
525
+
526
+ it('creates a post when authenticated', async () => {
527
+ const post = await authedCaller.post.create({
528
+ title: 'Test Post',
529
+ content: 'Test content',
530
+ });
531
+ expect(post.title).toBe('Test Post');
532
+ expect(post.authorId).toBe('user-1');
533
+ });
534
+
535
+ it('rejects create when unauthenticated', async () => {
536
+ await expect(
537
+ caller.post.create({ title: 'Test', content: 'Body' })
538
+ ).rejects.toThrow('UNAUTHORIZED');
539
+ });
540
+
541
+ it('rejects invalid input', async () => {
542
+ await expect(
543
+ authedCaller.post.create({ title: '', content: 'Body' })
544
+ ).rejects.toThrow();
545
+ });
546
+ });
547
+ ```
548
+
549
+ ## Error Handling
550
+
551
+ ### tRPC Error Codes
552
+
553
+ | Code | HTTP Status | When to Use |
554
+ |------|------------|-------------|
555
+ | `BAD_REQUEST` | 400 | Invalid input beyond Zod validation |
556
+ | `UNAUTHORIZED` | 401 | No authentication provided |
557
+ | `FORBIDDEN` | 403 | Authenticated but insufficient permissions |
558
+ | `NOT_FOUND` | 404 | Resource does not exist |
559
+ | `CONFLICT` | 409 | Duplicate resource or state conflict |
560
+ | `TOO_MANY_REQUESTS` | 429 | Rate limit exceeded |
561
+ | `INTERNAL_SERVER_ERROR` | 500 | Unexpected server error |
562
+
563
+ ## Anti-Patterns
564
+
565
+ | Anti-Pattern | Correct Approach |
566
+ |-------------|-----------------|
567
+ | Defining input schemas inline without reuse | Extract shared schemas to a `schemas/` directory |
568
+ | Putting business logic in procedures | Extract to service layer, keep procedures thin |
569
+ | Not using `superjson` transformer | Use superjson for Date, Map, Set, BigInt serialization |
570
+ | Using `any` for context type | Define a typed `Context` interface |
571
+ | Catching errors inside procedures to return success | Throw `TRPCError` and let the error formatter handle it |
572
+ | Not invalidating queries after mutations | Use `utils.[router].[procedure].invalidate()` after mutations |
573
+ | Creating one massive router file | Split into domain-specific routers and merge with `router()` |
574
+ | Using REST-style paths in procedure names | Use verb-less names: `post.list`, `post.byId`, not `post.getList` |
575
+ | Skipping input validation | Always use Zod `.input()` even for simple queries |
576
+ | Importing server code in client bundles | Only import `type AppRouter`, never the actual router |