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,595 @@
1
+ ---
2
+ name: socketio
3
+ description: Build real-time communication features with Socket.io including namespaces, rooms, event handling, middleware, scaling with Redis adapter, and testing. Use when implementing WebSocket-based real-time features like chat, notifications, live updates, or collaborative editing.
4
+ version: 1.0.0
5
+ ---
6
+
7
+ # Socket.io Realtime
8
+
9
+ Build real-time bidirectional communication with Socket.io. Socket.io provides WebSocket-based connections with automatic fallback to HTTP long-polling, reconnection, and room-based broadcasting.
10
+
11
+ ## When to Use This Skill
12
+
13
+ - Implementing real-time chat systems
14
+ - Building live notifications and activity feeds
15
+ - Creating collaborative editing features
16
+ - Streaming live data (dashboards, stock tickers, game state)
17
+ - Building multiplayer or multi-user interactive experiences
18
+ - Implementing presence (online/offline indicators)
19
+
20
+ ## Setup
21
+
22
+ ```bash
23
+ # Server
24
+ pnpm add socket.io
25
+
26
+ # Client
27
+ pnpm add socket.io-client
28
+ ```
29
+
30
+ ## Server Setup
31
+
32
+ ### Basic Server
33
+
34
+ ```typescript
35
+ // src/server/socket.ts
36
+ import { Server as SocketIOServer } from 'socket.io';
37
+ import type { Server as HTTPServer } from 'node:http';
38
+
39
+ export function createSocketServer(httpServer: HTTPServer): SocketIOServer {
40
+ const io = new SocketIOServer(httpServer, {
41
+ cors: {
42
+ origin: process.env.CLIENT_URL ?? 'http://localhost:3000',
43
+ methods: ['GET', 'POST'],
44
+ credentials: true,
45
+ },
46
+ // Connection settings
47
+ pingInterval: 25000, // How often to ping (ms)
48
+ pingTimeout: 20000, // How long to wait for pong (ms)
49
+ maxHttpBufferSize: 1e6, // Max message size (1MB)
50
+ connectionStateRecovery: {
51
+ maxDisconnectionDuration: 2 * 60 * 1000, // Recover state within 2 minutes
52
+ skipMiddlewares: false,
53
+ },
54
+ });
55
+
56
+ return io;
57
+ }
58
+ ```
59
+
60
+ ### With Express
61
+
62
+ ```typescript
63
+ import express from 'express';
64
+ import { createServer } from 'node:http';
65
+ import { createSocketServer } from './socket';
66
+
67
+ const app = express();
68
+ const httpServer = createServer(app);
69
+ const io = createSocketServer(httpServer);
70
+
71
+ registerEventHandlers(io);
72
+
73
+ httpServer.listen(3000, () => {
74
+ console.log('Server running on port 3000');
75
+ });
76
+ ```
77
+
78
+ ### With NestJS
79
+
80
+ ```typescript
81
+ // chat.gateway.ts
82
+ import {
83
+ WebSocketGateway,
84
+ WebSocketServer,
85
+ SubscribeMessage,
86
+ OnGatewayConnection,
87
+ OnGatewayDisconnect,
88
+ } from '@nestjs/websockets';
89
+ import { Server, Socket } from 'socket.io';
90
+
91
+ @WebSocketGateway({ cors: { origin: '*' } })
92
+ export class ChatGateway implements OnGatewayConnection, OnGatewayDisconnect {
93
+ @WebSocketServer()
94
+ server: Server;
95
+
96
+ handleConnection(client: Socket) {
97
+ console.log(`Client connected: ${client.id}`);
98
+ }
99
+
100
+ handleDisconnect(client: Socket) {
101
+ console.log(`Client disconnected: ${client.id}`);
102
+ }
103
+
104
+ @SubscribeMessage('message')
105
+ handleMessage(client: Socket, payload: { room: string; text: string }) {
106
+ this.server.to(payload.room).emit('message', {
107
+ senderId: client.id,
108
+ text: payload.text,
109
+ timestamp: Date.now(),
110
+ });
111
+ }
112
+ }
113
+ ```
114
+
115
+ ## Client Setup
116
+
117
+ ```typescript
118
+ // src/lib/socket-client.ts
119
+ import { io, Socket } from 'socket.io-client';
120
+
121
+ let socket: Socket | null = null;
122
+
123
+ export function getSocket(): Socket {
124
+ if (!socket) {
125
+ socket = io(import.meta.env.PUBLIC_WS_URL ?? 'http://localhost:3000', {
126
+ autoConnect: false, // Connect manually after auth
127
+ reconnection: true,
128
+ reconnectionAttempts: 10,
129
+ reconnectionDelay: 1000,
130
+ reconnectionDelayMax: 10000,
131
+ withCredentials: true,
132
+ auth: {
133
+ token: '', // Set before connecting
134
+ },
135
+ });
136
+ }
137
+ return socket;
138
+ }
139
+
140
+ export function connectSocket(token: string) {
141
+ const s = getSocket();
142
+ s.auth = { token };
143
+ s.connect();
144
+ return s;
145
+ }
146
+
147
+ export function disconnectSocket() {
148
+ socket?.disconnect();
149
+ socket = null;
150
+ }
151
+ ```
152
+
153
+ ### React Hook
154
+
155
+ ```typescript
156
+ // src/hooks/useSocket.ts
157
+ import { useEffect, useRef, useCallback } from 'react';
158
+ import { getSocket, connectSocket, disconnectSocket } from '@/lib/socket-client';
159
+ import type { Socket } from 'socket.io-client';
160
+
161
+ export function useSocket(token: string | null) {
162
+ const socketRef = useRef<Socket | null>(null);
163
+
164
+ useEffect(() => {
165
+ if (!token) return;
166
+
167
+ socketRef.current = connectSocket(token);
168
+
169
+ return () => {
170
+ disconnectSocket();
171
+ socketRef.current = null;
172
+ };
173
+ }, [token]);
174
+
175
+ return socketRef.current;
176
+ }
177
+
178
+ export function useSocketEvent<T>(
179
+ event: string,
180
+ handler: (data: T) => void,
181
+ ) {
182
+ const socket = getSocket();
183
+
184
+ useEffect(() => {
185
+ socket.on(event, handler);
186
+ return () => {
187
+ socket.off(event, handler);
188
+ };
189
+ }, [event, handler]);
190
+ }
191
+ ```
192
+
193
+ ## Event Handling
194
+
195
+ ### Server-Side Event Handlers
196
+
197
+ ```typescript
198
+ // src/server/handlers/chat.ts
199
+ import type { Server, Socket } from 'socket.io';
200
+
201
+ interface ChatMessage {
202
+ room: string;
203
+ text: string;
204
+ timestamp: number;
205
+ }
206
+
207
+ interface TypingEvent {
208
+ room: string;
209
+ userId: string;
210
+ isTyping: boolean;
211
+ }
212
+
213
+ export function registerChatHandlers(io: Server, socket: Socket) {
214
+ // Join a room
215
+ socket.on('chat:join', async (roomId: string) => {
216
+ await socket.join(roomId);
217
+ const userId = socket.data.userId;
218
+
219
+ // Notify others in the room
220
+ socket.to(roomId).emit('chat:user-joined', {
221
+ userId,
222
+ roomId,
223
+ timestamp: Date.now(),
224
+ });
225
+ });
226
+
227
+ // Leave a room
228
+ socket.on('chat:leave', async (roomId: string) => {
229
+ await socket.leave(roomId);
230
+ socket.to(roomId).emit('chat:user-left', {
231
+ userId: socket.data.userId,
232
+ roomId,
233
+ });
234
+ });
235
+
236
+ // Send a message
237
+ socket.on('chat:message', async (data: ChatMessage, callback) => {
238
+ const message = {
239
+ id: generateId(),
240
+ userId: socket.data.userId,
241
+ room: data.room,
242
+ text: data.text,
243
+ timestamp: Date.now(),
244
+ };
245
+
246
+ // Save to database
247
+ await db.messages.create(message);
248
+
249
+ // Broadcast to room (including sender)
250
+ io.to(data.room).emit('chat:message', message);
251
+
252
+ // Acknowledge receipt to sender
253
+ callback({ status: 'ok', messageId: message.id });
254
+ });
255
+
256
+ // Typing indicator
257
+ socket.on('chat:typing', (data: TypingEvent) => {
258
+ socket.to(data.room).emit('chat:typing', {
259
+ userId: data.userId,
260
+ isTyping: data.isTyping,
261
+ });
262
+ });
263
+ }
264
+ ```
265
+
266
+ ### Registering Handlers
267
+
268
+ ```typescript
269
+ // src/server/handlers/index.ts
270
+ import type { Server } from 'socket.io';
271
+ import { registerChatHandlers } from './chat';
272
+ import { registerPresenceHandlers } from './presence';
273
+ import { registerNotificationHandlers } from './notifications';
274
+
275
+ export function registerEventHandlers(io: Server) {
276
+ io.on('connection', (socket) => {
277
+ console.log(`Connected: ${socket.id}, user: ${socket.data.userId}`);
278
+
279
+ registerChatHandlers(io, socket);
280
+ registerPresenceHandlers(io, socket);
281
+ registerNotificationHandlers(io, socket);
282
+
283
+ socket.on('disconnect', (reason) => {
284
+ console.log(`Disconnected: ${socket.id}, reason: ${reason}`);
285
+ });
286
+ });
287
+ }
288
+ ```
289
+
290
+ ## Acknowledgements
291
+
292
+ Acknowledgements provide request-response semantics over WebSockets.
293
+
294
+ ```typescript
295
+ // Server
296
+ socket.on('file:upload', async (fileData: Buffer, metadata: FileMetadata, callback) => {
297
+ try {
298
+ const result = await uploadFile(fileData, metadata);
299
+ callback({ status: 'ok', url: result.url });
300
+ } catch (error) {
301
+ callback({ status: 'error', message: error.message });
302
+ }
303
+ });
304
+
305
+ // Client
306
+ socket.emit('file:upload', fileBuffer, metadata, (response) => {
307
+ if (response.status === 'ok') {
308
+ console.log('Uploaded:', response.url);
309
+ } else {
310
+ console.error('Upload failed:', response.message);
311
+ }
312
+ });
313
+
314
+ // Client with timeout
315
+ socket.timeout(5000).emit('file:upload', fileBuffer, metadata, (err, response) => {
316
+ if (err) {
317
+ // Timeout or disconnection
318
+ console.error('Request timed out');
319
+ } else {
320
+ console.log('Response:', response);
321
+ }
322
+ });
323
+ ```
324
+
325
+ ## Namespaces
326
+
327
+ Namespaces separate concerns on a single connection.
328
+
329
+ ```typescript
330
+ // Server
331
+ const chatNamespace = io.of('/chat');
332
+ const notificationsNamespace = io.of('/notifications');
333
+
334
+ chatNamespace.on('connection', (socket) => {
335
+ // Only handles chat events
336
+ socket.on('message', (data) => { /* ... */ });
337
+ });
338
+
339
+ notificationsNamespace.on('connection', (socket) => {
340
+ // Only handles notification events
341
+ socket.on('mark-read', (id) => { /* ... */ });
342
+ });
343
+
344
+ // Client
345
+ const chatSocket = io('http://localhost:3000/chat');
346
+ const notifSocket = io('http://localhost:3000/notifications');
347
+
348
+ chatSocket.emit('message', { text: 'Hello' });
349
+ notifSocket.emit('mark-read', notifId);
350
+ ```
351
+
352
+ ## Middleware
353
+
354
+ ### Authentication Middleware
355
+
356
+ ```typescript
357
+ // Server-side auth middleware
358
+ io.use(async (socket, next) => {
359
+ const token = socket.handshake.auth.token;
360
+
361
+ if (!token) {
362
+ return next(new Error('Authentication required'));
363
+ }
364
+
365
+ try {
366
+ const user = await verifyToken(token);
367
+ socket.data.userId = user.id;
368
+ socket.data.role = user.role;
369
+ next();
370
+ } catch {
371
+ next(new Error('Invalid authentication token'));
372
+ }
373
+ });
374
+
375
+ // Namespace-level middleware
376
+ chatNamespace.use(async (socket, next) => {
377
+ // Additional middleware for chat namespace
378
+ const userId = socket.data.userId;
379
+ const canChat = await checkChatPermission(userId);
380
+ if (!canChat) {
381
+ return next(new Error('Chat access denied'));
382
+ }
383
+ next();
384
+ });
385
+ ```
386
+
387
+ ### Logging Middleware
388
+
389
+ ```typescript
390
+ io.use((socket, next) => {
391
+ const originalEmit = socket.emit;
392
+ socket.emit = function (event: string, ...args: unknown[]) {
393
+ console.log(`[OUT] ${socket.id} ${event}`);
394
+ return originalEmit.apply(socket, [event, ...args]);
395
+ };
396
+
397
+ socket.onAny((event, ...args) => {
398
+ console.log(`[IN] ${socket.id} ${event}`);
399
+ });
400
+
401
+ next();
402
+ });
403
+ ```
404
+
405
+ ## Broadcasting Patterns
406
+
407
+ ```typescript
408
+ // To all connected clients
409
+ io.emit('announcement', { message: 'Server restarting in 5 minutes' });
410
+
411
+ // To all clients in a room (excluding sender)
412
+ socket.to('room-123').emit('message', data);
413
+
414
+ // To all clients in a room (including sender)
415
+ io.to('room-123').emit('message', data);
416
+
417
+ // To multiple rooms
418
+ io.to('room-1').to('room-2').emit('alert', data);
419
+
420
+ // To all except specific sockets
421
+ socket.broadcast.emit('user-joined', { userId: socket.data.userId });
422
+
423
+ // To a specific socket by ID
424
+ io.to(targetSocketId).emit('private-message', data);
425
+
426
+ // To all sockets of a specific user (multi-device)
427
+ io.to(`user:${userId}`).emit('notification', data);
428
+ // (Requires joining user-specific room on connect:
429
+ // socket.join(`user:${socket.data.userId}`))
430
+ ```
431
+
432
+ ## Rooms for Presence
433
+
434
+ ```typescript
435
+ // src/server/handlers/presence.ts
436
+ export function registerPresenceHandlers(io: Server, socket: Socket) {
437
+ const userId = socket.data.userId;
438
+
439
+ // Join user-specific room for multi-device support
440
+ socket.join(`user:${userId}`);
441
+
442
+ // Track online status
443
+ socket.on('presence:online', async () => {
444
+ await redis.sadd('online-users', userId);
445
+ io.emit('presence:update', { userId, status: 'online' });
446
+ });
447
+
448
+ socket.on('disconnect', async () => {
449
+ // Check if user has other connected sockets
450
+ const userSockets = await io.in(`user:${userId}`).fetchSockets();
451
+ if (userSockets.length === 0) {
452
+ await redis.srem('online-users', userId);
453
+ io.emit('presence:update', { userId, status: 'offline' });
454
+ }
455
+ });
456
+ }
457
+ ```
458
+
459
+ ## Scaling with Redis Adapter
460
+
461
+ For multi-server deployments, use the Redis adapter to share state across instances.
462
+
463
+ ```bash
464
+ pnpm add @socket.io/redis-adapter redis
465
+ ```
466
+
467
+ ```typescript
468
+ import { createAdapter } from '@socket.io/redis-adapter';
469
+ import { createClient } from 'redis';
470
+
471
+ const pubClient = createClient({ url: process.env.REDIS_URL });
472
+ const subClient = pubClient.duplicate();
473
+
474
+ await Promise.all([pubClient.connect(), subClient.connect()]);
475
+
476
+ io.adapter(createAdapter(pubClient, subClient));
477
+
478
+ // Now io.emit(), io.to(), rooms, etc. work across all server instances
479
+ ```
480
+
481
+ ## Error Handling
482
+
483
+ ```typescript
484
+ // Server: Global error handler
485
+ io.engine.on('connection_error', (err) => {
486
+ console.error('Connection error:', err.code, err.message);
487
+ });
488
+
489
+ // Per-socket error handler
490
+ socket.on('error', (error) => {
491
+ console.error(`Socket ${socket.id} error:`, error);
492
+ });
493
+
494
+ // Client: Error handling
495
+ socket.on('connect_error', (error) => {
496
+ if (error.message === 'Authentication required') {
497
+ // Redirect to login
498
+ window.location.href = '/login';
499
+ } else {
500
+ console.error('Connection error:', error.message);
501
+ }
502
+ });
503
+
504
+ socket.on('disconnect', (reason) => {
505
+ if (reason === 'io server disconnect') {
506
+ // Server intentionally disconnected -- reconnect manually
507
+ socket.connect();
508
+ }
509
+ // Otherwise, socket.io will auto-reconnect
510
+ });
511
+ ```
512
+
513
+ ## Testing
514
+
515
+ ```typescript
516
+ import { createServer } from 'node:http';
517
+ import { Server } from 'socket.io';
518
+ import { io as ioClient, Socket as ClientSocket } from 'socket.io-client';
519
+ import { afterAll, beforeAll, describe, expect, it } from 'vitest';
520
+
521
+ describe('Chat Socket', () => {
522
+ let io: Server;
523
+ let serverSocket: any;
524
+ let clientSocket: ClientSocket;
525
+
526
+ beforeAll((done) => {
527
+ const httpServer = createServer();
528
+ io = new Server(httpServer);
529
+
530
+ httpServer.listen(() => {
531
+ const port = (httpServer.address() as any).port;
532
+
533
+ io.on('connection', (socket) => {
534
+ serverSocket = socket;
535
+ });
536
+
537
+ clientSocket = ioClient(`http://localhost:${port}`, {
538
+ auth: { token: 'test-token' },
539
+ });
540
+
541
+ clientSocket.on('connect', done);
542
+ });
543
+ });
544
+
545
+ afterAll(() => {
546
+ io.close();
547
+ clientSocket.disconnect();
548
+ });
549
+
550
+ it('should receive messages in rooms', (done) => {
551
+ serverSocket.join('test-room');
552
+
553
+ serverSocket.on('chat:message', (data: any) => {
554
+ expect(data.text).toBe('Hello');
555
+ io.to('test-room').emit('chat:message', {
556
+ id: '1',
557
+ text: data.text,
558
+ userId: 'test-user',
559
+ });
560
+ });
561
+
562
+ clientSocket.on('chat:message', (msg) => {
563
+ expect(msg.text).toBe('Hello');
564
+ done();
565
+ });
566
+
567
+ clientSocket.emit('chat:message', { room: 'test-room', text: 'Hello' });
568
+ });
569
+
570
+ it('should acknowledge message receipt', (done) => {
571
+ serverSocket.on('chat:message', (_data: any, callback: Function) => {
572
+ callback({ status: 'ok', messageId: '123' });
573
+ });
574
+
575
+ clientSocket.emit('chat:message', { text: 'Test' }, (response: any) => {
576
+ expect(response.status).toBe('ok');
577
+ expect(response.messageId).toBe('123');
578
+ done();
579
+ });
580
+ });
581
+ });
582
+ ```
583
+
584
+ ## Anti-Patterns
585
+
586
+ | Anti-Pattern | Correct Approach |
587
+ |-------------|-----------------|
588
+ | Storing state in socket object properties | Use `socket.data` (typed) or external store (Redis) |
589
+ | Not validating incoming event payloads | Validate with Zod/schema before processing |
590
+ | Broadcasting sensitive data to all clients | Use rooms and namespaces to scope data delivery |
591
+ | Not handling reconnection on the client | Configure `reconnection`, `reconnectionAttempts`, and handle `reconnect` event |
592
+ | Using Socket.io for file transfer | Use HTTP for file uploads; Socket.io for signaling only |
593
+ | Not implementing heartbeats/presence checks | Socket.io has built-in ping/pong, but implement app-level presence |
594
+ | Emitting events without acknowledgements for critical operations | Use callbacks for operations that need confirmation |
595
+ | Running multiple Socket.io servers without Redis adapter | State (rooms, sockets) is not shared -- use Redis adapter |