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,878 @@
1
+ ---
2
+ name: nestjs
3
+ description: Build scalable server-side applications with NestJS including modules, controllers, providers, dependency injection, guards, interceptors, pipes, and testing. Use when developing structured Node.js backends with TypeScript, REST/GraphQL APIs, WebSocket servers, or microservices.
4
+ version: 1.0.0
5
+ ---
6
+
7
+ # NestJS
8
+
9
+ Build scalable, maintainable server-side applications with NestJS. NestJS is a TypeScript-first Node.js framework that uses decorators, dependency injection, and a modular architecture inspired by Angular.
10
+
11
+ ## When to Use This Skill
12
+
13
+ - Building structured REST or GraphQL APIs
14
+ - Implementing microservice architectures
15
+ - Creating WebSocket servers
16
+ - Developing applications that need dependency injection and modular organization
17
+ - Building enterprise-grade Node.js backends with strong typing
18
+
19
+ ## Project Structure
20
+
21
+ ```
22
+ src/
23
+ app.module.ts # Root module
24
+ main.ts # Entry point
25
+ common/
26
+ decorators/ # Custom decorators
27
+ filters/ # Exception filters
28
+ guards/ # Auth and role guards
29
+ interceptors/ # Request/response interceptors
30
+ pipes/ # Validation pipes
31
+ middleware/ # HTTP middleware
32
+ modules/
33
+ users/
34
+ users.module.ts
35
+ users.controller.ts
36
+ users.service.ts
37
+ users.repository.ts
38
+ dto/
39
+ create-user.dto.ts
40
+ update-user.dto.ts
41
+ entities/
42
+ user.entity.ts
43
+ users.controller.spec.ts
44
+ users.service.spec.ts
45
+ auth/
46
+ auth.module.ts
47
+ auth.controller.ts
48
+ auth.service.ts
49
+ auth.guard.ts
50
+ strategies/
51
+ jwt.strategy.ts
52
+ local.strategy.ts
53
+ test/
54
+ app.e2e-spec.ts
55
+ ```
56
+
57
+ ## Setup
58
+
59
+ ```bash
60
+ # Create new project
61
+ npx @nestjs/cli new project-name
62
+
63
+ # Or add NestJS to existing project
64
+ pnpm add @nestjs/core @nestjs/common @nestjs/platform-express reflect-metadata
65
+ ```
66
+
67
+ ### Entry Point
68
+
69
+ ```typescript
70
+ // src/main.ts
71
+ import { NestFactory } from '@nestjs/core';
72
+ import { ValidationPipe, VersioningType } from '@nestjs/common';
73
+ import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
74
+ import helmet from 'helmet';
75
+ import { AppModule } from './app.module';
76
+
77
+ async function bootstrap() {
78
+ const app = await NestFactory.create(AppModule, {
79
+ logger: ['error', 'warn', 'log'],
80
+ });
81
+
82
+ // Security
83
+ app.use(helmet());
84
+ app.enableCors({
85
+ origin: process.env.CLIENT_URL,
86
+ credentials: true,
87
+ });
88
+
89
+ // Global validation pipe
90
+ app.useGlobalPipes(
91
+ new ValidationPipe({
92
+ whitelist: true, // Strip unknown properties
93
+ forbidNonWhitelisted: true, // Throw on unknown properties
94
+ transform: true, // Auto-transform payloads to DTO instances
95
+ transformOptions: {
96
+ enableImplicitConversion: true,
97
+ },
98
+ }),
99
+ );
100
+
101
+ // API versioning
102
+ app.enableVersioning({
103
+ type: VersioningType.URI,
104
+ defaultVersion: '1',
105
+ });
106
+
107
+ // Swagger / OpenAPI
108
+ const config = new DocumentBuilder()
109
+ .setTitle('API')
110
+ .setVersion('1.0')
111
+ .addBearerAuth()
112
+ .build();
113
+ const document = SwaggerModule.createDocument(app, config);
114
+ SwaggerModule.setup('api/docs', app, document);
115
+
116
+ await app.listen(process.env.PORT ?? 3000);
117
+ }
118
+
119
+ bootstrap();
120
+ ```
121
+
122
+ ## Modules
123
+
124
+ Modules organize the application into cohesive blocks.
125
+
126
+ ```typescript
127
+ // src/modules/users/users.module.ts
128
+ import { Module } from '@nestjs/common';
129
+ import { TypeOrmModule } from '@nestjs/typeorm';
130
+ import { UsersController } from './users.controller';
131
+ import { UsersService } from './users.service';
132
+ import { UsersRepository } from './users.repository';
133
+ import { User } from './entities/user.entity';
134
+
135
+ @Module({
136
+ imports: [TypeOrmModule.forFeature([User])],
137
+ controllers: [UsersController],
138
+ providers: [UsersService, UsersRepository],
139
+ exports: [UsersService], // Available to other modules that import UsersModule
140
+ })
141
+ export class UsersModule {}
142
+ ```
143
+
144
+ ```typescript
145
+ // src/app.module.ts
146
+ import { Module } from '@nestjs/common';
147
+ import { ConfigModule, ConfigService } from '@nestjs/config';
148
+ import { TypeOrmModule } from '@nestjs/typeorm';
149
+ import { UsersModule } from './modules/users/users.module';
150
+ import { AuthModule } from './modules/auth/auth.module';
151
+ import { PostsModule } from './modules/posts/posts.module';
152
+
153
+ @Module({
154
+ imports: [
155
+ ConfigModule.forRoot({
156
+ isGlobal: true,
157
+ envFilePath: `.env.${process.env.NODE_ENV ?? 'development'}`,
158
+ }),
159
+ TypeOrmModule.forRootAsync({
160
+ imports: [ConfigModule],
161
+ inject: [ConfigService],
162
+ useFactory: (config: ConfigService) => ({
163
+ type: 'postgres',
164
+ host: config.get('DB_HOST'),
165
+ port: config.get('DB_PORT'),
166
+ username: config.get('DB_USER'),
167
+ password: config.get('DB_PASSWORD'),
168
+ database: config.get('DB_NAME'),
169
+ autoLoadEntities: true,
170
+ synchronize: config.get('NODE_ENV') === 'development',
171
+ }),
172
+ }),
173
+ UsersModule,
174
+ AuthModule,
175
+ PostsModule,
176
+ ],
177
+ })
178
+ export class AppModule {}
179
+ ```
180
+
181
+ ## Controllers
182
+
183
+ Controllers handle incoming requests and return responses.
184
+
185
+ ```typescript
186
+ // src/modules/users/users.controller.ts
187
+ import {
188
+ Controller,
189
+ Get,
190
+ Post,
191
+ Put,
192
+ Delete,
193
+ Param,
194
+ Body,
195
+ Query,
196
+ HttpCode,
197
+ HttpStatus,
198
+ ParseUUIDPipe,
199
+ UseGuards,
200
+ } from '@nestjs/common';
201
+ import { ApiTags, ApiOperation, ApiBearerAuth, ApiResponse } from '@nestjs/swagger';
202
+ import { UsersService } from './users.service';
203
+ import { CreateUserDto } from './dto/create-user.dto';
204
+ import { UpdateUserDto } from './dto/update-user.dto';
205
+ import { ListUsersQueryDto } from './dto/list-users-query.dto';
206
+ import { JwtAuthGuard } from '../auth/jwt-auth.guard';
207
+ import { RolesGuard } from '../../common/guards/roles.guard';
208
+ import { Roles } from '../../common/decorators/roles.decorator';
209
+ import { CurrentUser } from '../../common/decorators/current-user.decorator';
210
+
211
+ @ApiTags('Users')
212
+ @Controller('users')
213
+ export class UsersController {
214
+ constructor(private readonly usersService: UsersService) {}
215
+
216
+ @Post()
217
+ @HttpCode(HttpStatus.CREATED)
218
+ @ApiOperation({ summary: 'Create a new user' })
219
+ @ApiResponse({ status: 201, description: 'User created' })
220
+ @ApiResponse({ status: 422, description: 'Validation failed' })
221
+ async create(@Body() createUserDto: CreateUserDto) {
222
+ return this.usersService.create(createUserDto);
223
+ }
224
+
225
+ @Get()
226
+ @UseGuards(JwtAuthGuard)
227
+ @ApiBearerAuth()
228
+ @ApiOperation({ summary: 'List all users' })
229
+ async findAll(@Query() query: ListUsersQueryDto) {
230
+ return this.usersService.findAll(query);
231
+ }
232
+
233
+ @Get(':id')
234
+ @UseGuards(JwtAuthGuard)
235
+ @ApiBearerAuth()
236
+ @ApiOperation({ summary: 'Get user by ID' })
237
+ @ApiResponse({ status: 404, description: 'User not found' })
238
+ async findOne(@Param('id', ParseUUIDPipe) id: string) {
239
+ return this.usersService.findOneOrFail(id);
240
+ }
241
+
242
+ @Put(':id')
243
+ @UseGuards(JwtAuthGuard)
244
+ @ApiBearerAuth()
245
+ async update(
246
+ @Param('id', ParseUUIDPipe) id: string,
247
+ @Body() updateUserDto: UpdateUserDto,
248
+ @CurrentUser() currentUser: UserPayload,
249
+ ) {
250
+ return this.usersService.update(id, updateUserDto, currentUser);
251
+ }
252
+
253
+ @Delete(':id')
254
+ @HttpCode(HttpStatus.NO_CONTENT)
255
+ @UseGuards(JwtAuthGuard, RolesGuard)
256
+ @Roles('admin')
257
+ @ApiBearerAuth()
258
+ async remove(@Param('id', ParseUUIDPipe) id: string) {
259
+ await this.usersService.remove(id);
260
+ }
261
+ }
262
+ ```
263
+
264
+ ## DTOs (Data Transfer Objects)
265
+
266
+ ```typescript
267
+ // src/modules/users/dto/create-user.dto.ts
268
+ import { IsString, IsEmail, MinLength, MaxLength, IsOptional, IsEnum } from 'class-validator';
269
+ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
270
+
271
+ export class CreateUserDto {
272
+ @ApiProperty({ example: 'John Doe' })
273
+ @IsString()
274
+ @MinLength(2)
275
+ @MaxLength(100)
276
+ name: string;
277
+
278
+ @ApiProperty({ example: 'john@example.com' })
279
+ @IsEmail()
280
+ email: string;
281
+
282
+ @ApiProperty({ minLength: 8 })
283
+ @IsString()
284
+ @MinLength(8)
285
+ @MaxLength(128)
286
+ password: string;
287
+
288
+ @ApiPropertyOptional({ enum: ['user', 'admin'], default: 'user' })
289
+ @IsOptional()
290
+ @IsEnum(['user', 'admin'])
291
+ role?: 'user' | 'admin';
292
+ }
293
+ ```
294
+
295
+ ```typescript
296
+ // src/modules/users/dto/update-user.dto.ts
297
+ import { PartialType, OmitType } from '@nestjs/swagger';
298
+ import { CreateUserDto } from './create-user.dto';
299
+
300
+ // All fields from CreateUserDto become optional, password excluded
301
+ export class UpdateUserDto extends PartialType(OmitType(CreateUserDto, ['password'] as const)) {}
302
+ ```
303
+
304
+ ```typescript
305
+ // src/modules/users/dto/list-users-query.dto.ts
306
+ import { IsOptional, IsInt, Min, Max, IsEnum } from 'class-validator';
307
+ import { Type } from 'class-transformer';
308
+
309
+ export class ListUsersQueryDto {
310
+ @IsOptional()
311
+ @Type(() => Number)
312
+ @IsInt()
313
+ @Min(1)
314
+ page?: number = 1;
315
+
316
+ @IsOptional()
317
+ @Type(() => Number)
318
+ @IsInt()
319
+ @Min(1)
320
+ @Max(100)
321
+ limit?: number = 20;
322
+
323
+ @IsOptional()
324
+ @IsEnum(['user', 'admin'])
325
+ role?: 'user' | 'admin';
326
+ }
327
+ ```
328
+
329
+ ## Providers (Services)
330
+
331
+ ```typescript
332
+ // src/modules/users/users.service.ts
333
+ import { Injectable, NotFoundException, ConflictException } from '@nestjs/common';
334
+ import { InjectRepository } from '@nestjs/typeorm';
335
+ import { Repository } from 'typeorm';
336
+ import { User } from './entities/user.entity';
337
+ import { CreateUserDto } from './dto/create-user.dto';
338
+ import { UpdateUserDto } from './dto/update-user.dto';
339
+ import { ListUsersQueryDto } from './dto/list-users-query.dto';
340
+ import * as bcrypt from 'bcrypt';
341
+
342
+ @Injectable()
343
+ export class UsersService {
344
+ constructor(
345
+ @InjectRepository(User)
346
+ private readonly userRepo: Repository<User>,
347
+ ) {}
348
+
349
+ async create(dto: CreateUserDto): Promise<User> {
350
+ const existing = await this.userRepo.findOne({ where: { email: dto.email } });
351
+ if (existing) {
352
+ throw new ConflictException('Email already registered');
353
+ }
354
+
355
+ const hashedPassword = await bcrypt.hash(dto.password, 12);
356
+ const user = this.userRepo.create({
357
+ ...dto,
358
+ password: hashedPassword,
359
+ });
360
+
361
+ return this.userRepo.save(user);
362
+ }
363
+
364
+ async findAll(query: ListUsersQueryDto) {
365
+ const { page = 1, limit = 20, role } = query;
366
+ const where = role ? { role } : {};
367
+
368
+ const [data, total] = await this.userRepo.findAndCount({
369
+ where,
370
+ skip: (page - 1) * limit,
371
+ take: limit,
372
+ order: { createdAt: 'DESC' },
373
+ select: ['id', 'name', 'email', 'role', 'createdAt'], // Never return password
374
+ });
375
+
376
+ return { data, total, page, limit, totalPages: Math.ceil(total / limit) };
377
+ }
378
+
379
+ async findOneOrFail(id: string): Promise<User> {
380
+ const user = await this.userRepo.findOne({ where: { id } });
381
+ if (!user) {
382
+ throw new NotFoundException(`User ${id} not found`);
383
+ }
384
+ return user;
385
+ }
386
+
387
+ async findByEmail(email: string): Promise<User | null> {
388
+ return this.userRepo.findOne({ where: { email } });
389
+ }
390
+
391
+ async update(id: string, dto: UpdateUserDto, currentUser: UserPayload): Promise<User> {
392
+ const user = await this.findOneOrFail(id);
393
+
394
+ if (currentUser.id !== id && currentUser.role !== 'admin') {
395
+ throw new ForbiddenException('Cannot update another user');
396
+ }
397
+
398
+ Object.assign(user, dto);
399
+ return this.userRepo.save(user);
400
+ }
401
+
402
+ async remove(id: string): Promise<void> {
403
+ const result = await this.userRepo.delete(id);
404
+ if (result.affected === 0) {
405
+ throw new NotFoundException(`User ${id} not found`);
406
+ }
407
+ }
408
+ }
409
+ ```
410
+
411
+ ## Guards
412
+
413
+ Guards determine whether a request should be handled.
414
+
415
+ ```typescript
416
+ // src/common/guards/roles.guard.ts
417
+ import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
418
+ import { Reflector } from '@nestjs/core';
419
+ import { ROLES_KEY } from '../decorators/roles.decorator';
420
+
421
+ @Injectable()
422
+ export class RolesGuard implements CanActivate {
423
+ constructor(private reflector: Reflector) {}
424
+
425
+ canActivate(context: ExecutionContext): boolean {
426
+ const requiredRoles = this.reflector.getAllAndOverride<string[]>(ROLES_KEY, [
427
+ context.getHandler(),
428
+ context.getClass(),
429
+ ]);
430
+
431
+ if (!requiredRoles) return true;
432
+
433
+ const { user } = context.switchToHttp().getRequest();
434
+ return requiredRoles.includes(user.role);
435
+ }
436
+ }
437
+ ```
438
+
439
+ ```typescript
440
+ // JWT Auth Guard
441
+ // src/modules/auth/jwt-auth.guard.ts
442
+ import { Injectable, ExecutionContext, UnauthorizedException } from '@nestjs/common';
443
+ import { AuthGuard } from '@nestjs/passport';
444
+
445
+ @Injectable()
446
+ export class JwtAuthGuard extends AuthGuard('jwt') {
447
+ handleRequest(err: any, user: any) {
448
+ if (err || !user) {
449
+ throw new UnauthorizedException('Invalid or expired token');
450
+ }
451
+ return user;
452
+ }
453
+ }
454
+ ```
455
+
456
+ ## Interceptors
457
+
458
+ Interceptors transform the result or handle cross-cutting concerns.
459
+
460
+ ```typescript
461
+ // src/common/interceptors/transform.interceptor.ts
462
+ import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
463
+ import { Observable, map } from 'rxjs';
464
+
465
+ export interface ApiResponse<T> {
466
+ data: T;
467
+ statusCode: number;
468
+ timestamp: string;
469
+ }
470
+
471
+ @Injectable()
472
+ export class TransformInterceptor<T> implements NestInterceptor<T, ApiResponse<T>> {
473
+ intercept(context: ExecutionContext, next: CallHandler): Observable<ApiResponse<T>> {
474
+ const statusCode = context.switchToHttp().getResponse().statusCode;
475
+
476
+ return next.handle().pipe(
477
+ map((data) => ({
478
+ data,
479
+ statusCode,
480
+ timestamp: new Date().toISOString(),
481
+ })),
482
+ );
483
+ }
484
+ }
485
+ ```
486
+
487
+ ```typescript
488
+ // src/common/interceptors/logging.interceptor.ts
489
+ import { Injectable, NestInterceptor, ExecutionContext, CallHandler, Logger } from '@nestjs/common';
490
+ import { Observable, tap } from 'rxjs';
491
+
492
+ @Injectable()
493
+ export class LoggingInterceptor implements NestInterceptor {
494
+ private readonly logger = new Logger('HTTP');
495
+
496
+ intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
497
+ const req = context.switchToHttp().getRequest();
498
+ const { method, url } = req;
499
+ const start = Date.now();
500
+
501
+ return next.handle().pipe(
502
+ tap(() => {
503
+ const elapsed = Date.now() - start;
504
+ this.logger.log(`${method} ${url} ${elapsed}ms`);
505
+ }),
506
+ );
507
+ }
508
+ }
509
+ ```
510
+
511
+ ## Pipes
512
+
513
+ Pipes transform or validate input data.
514
+
515
+ ```typescript
516
+ // src/common/pipes/parse-optional-int.pipe.ts
517
+ import { PipeTransform, Injectable, BadRequestException } from '@nestjs/common';
518
+
519
+ @Injectable()
520
+ export class ParseOptionalIntPipe implements PipeTransform<string | undefined, number | undefined> {
521
+ transform(value: string | undefined): number | undefined {
522
+ if (value === undefined || value === null || value === '') {
523
+ return undefined;
524
+ }
525
+ const parsed = parseInt(value, 10);
526
+ if (isNaN(parsed)) {
527
+ throw new BadRequestException(`"${value}" is not a valid integer`);
528
+ }
529
+ return parsed;
530
+ }
531
+ }
532
+ ```
533
+
534
+ ## Exception Filters
535
+
536
+ ```typescript
537
+ // src/common/filters/all-exceptions.filter.ts
538
+ import {
539
+ ExceptionFilter,
540
+ Catch,
541
+ ArgumentsHost,
542
+ HttpException,
543
+ HttpStatus,
544
+ Logger,
545
+ } from '@nestjs/common';
546
+
547
+ @Catch()
548
+ export class AllExceptionsFilter implements ExceptionFilter {
549
+ private readonly logger = new Logger('ExceptionFilter');
550
+
551
+ catch(exception: unknown, host: ArgumentsHost) {
552
+ const ctx = host.switchToHttp();
553
+ const response = ctx.getResponse();
554
+ const request = ctx.getRequest();
555
+
556
+ const status =
557
+ exception instanceof HttpException
558
+ ? exception.getStatus()
559
+ : HttpStatus.INTERNAL_SERVER_ERROR;
560
+
561
+ const message =
562
+ exception instanceof HttpException
563
+ ? exception.getResponse()
564
+ : 'Internal server error';
565
+
566
+ // Log internal errors with stack trace
567
+ if (status >= 500) {
568
+ this.logger.error(
569
+ `${request.method} ${request.url} ${status}`,
570
+ exception instanceof Error ? exception.stack : undefined,
571
+ );
572
+ }
573
+
574
+ response.status(status).json({
575
+ statusCode: status,
576
+ message: typeof message === 'string' ? message : (message as any).message,
577
+ timestamp: new Date().toISOString(),
578
+ path: request.url,
579
+ });
580
+ }
581
+ }
582
+ ```
583
+
584
+ ## Custom Decorators
585
+
586
+ ```typescript
587
+ // src/common/decorators/roles.decorator.ts
588
+ import { SetMetadata } from '@nestjs/common';
589
+
590
+ export const ROLES_KEY = 'roles';
591
+ export const Roles = (...roles: string[]) => SetMetadata(ROLES_KEY, roles);
592
+ ```
593
+
594
+ ```typescript
595
+ // src/common/decorators/current-user.decorator.ts
596
+ import { createParamDecorator, ExecutionContext } from '@nestjs/common';
597
+
598
+ export const CurrentUser = createParamDecorator(
599
+ (data: string | undefined, ctx: ExecutionContext) => {
600
+ const request = ctx.switchToHttp().getRequest();
601
+ const user = request.user;
602
+ return data ? user?.[data] : user;
603
+ },
604
+ );
605
+
606
+ // Usage: @CurrentUser() user: UserPayload
607
+ // Usage: @CurrentUser('id') userId: string
608
+ ```
609
+
610
+ ## Middleware
611
+
612
+ ```typescript
613
+ // src/common/middleware/request-id.middleware.ts
614
+ import { Injectable, NestMiddleware } from '@nestjs/common';
615
+ import { Request, Response, NextFunction } from 'express';
616
+ import { randomUUID } from 'node:crypto';
617
+
618
+ @Injectable()
619
+ export class RequestIdMiddleware implements NestMiddleware {
620
+ use(req: Request, _res: Response, next: NextFunction) {
621
+ req.headers['x-request-id'] = req.headers['x-request-id'] ?? randomUUID();
622
+ next();
623
+ }
624
+ }
625
+
626
+ // Register in module
627
+ @Module({})
628
+ export class AppModule implements NestModule {
629
+ configure(consumer: MiddlewareConsumer) {
630
+ consumer.apply(RequestIdMiddleware).forRoutes('*');
631
+ }
632
+ }
633
+ ```
634
+
635
+ ## Database Integration (TypeORM)
636
+
637
+ ```typescript
638
+ // src/modules/users/entities/user.entity.ts
639
+ import {
640
+ Entity,
641
+ PrimaryGeneratedColumn,
642
+ Column,
643
+ CreateDateColumn,
644
+ UpdateDateColumn,
645
+ OneToMany,
646
+ Index,
647
+ } from 'typeorm';
648
+ import { Exclude } from 'class-transformer';
649
+
650
+ @Entity('users')
651
+ export class User {
652
+ @PrimaryGeneratedColumn('uuid')
653
+ id: string;
654
+
655
+ @Column({ length: 100 })
656
+ name: string;
657
+
658
+ @Index({ unique: true })
659
+ @Column({ length: 255 })
660
+ email: string;
661
+
662
+ @Column()
663
+ @Exclude() // Never serialize password
664
+ password: string;
665
+
666
+ @Column({ type: 'enum', enum: ['user', 'admin'], default: 'user' })
667
+ role: 'user' | 'admin';
668
+
669
+ @CreateDateColumn()
670
+ createdAt: Date;
671
+
672
+ @UpdateDateColumn()
673
+ updatedAt: Date;
674
+
675
+ @OneToMany(() => Post, (post) => post.author)
676
+ posts: Post[];
677
+ }
678
+ ```
679
+
680
+ ## Database Integration (Prisma)
681
+
682
+ ```typescript
683
+ // src/prisma/prisma.service.ts
684
+ import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common';
685
+ import { PrismaClient } from '@prisma/client';
686
+
687
+ @Injectable()
688
+ export class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy {
689
+ async onModuleInit() {
690
+ await this.$connect();
691
+ }
692
+
693
+ async onModuleDestroy() {
694
+ await this.$disconnect();
695
+ }
696
+ }
697
+
698
+ // src/prisma/prisma.module.ts
699
+ @Module({
700
+ providers: [PrismaService],
701
+ exports: [PrismaService],
702
+ })
703
+ export class PrismaModule {}
704
+
705
+ // Usage in service
706
+ @Injectable()
707
+ export class UsersService {
708
+ constructor(private readonly prisma: PrismaService) {}
709
+
710
+ async findAll() {
711
+ return this.prisma.user.findMany();
712
+ }
713
+ }
714
+ ```
715
+
716
+ ## OpenAPI Generation
717
+
718
+ ```typescript
719
+ // Swagger decorators on controllers
720
+ @ApiTags('Users')
721
+ @ApiBearerAuth()
722
+ @Controller('users')
723
+ export class UsersController {
724
+ @Post()
725
+ @ApiOperation({ summary: 'Create user' })
726
+ @ApiBody({ type: CreateUserDto })
727
+ @ApiResponse({ status: 201, description: 'User created', type: UserResponseDto })
728
+ @ApiResponse({ status: 409, description: 'Email already exists' })
729
+ @ApiResponse({ status: 422, description: 'Validation failed' })
730
+ create(@Body() dto: CreateUserDto) { /* ... */ }
731
+ }
732
+
733
+ // Generate OpenAPI spec as JSON
734
+ // Available at: GET /api/docs-json
735
+ // Swagger UI at: GET /api/docs
736
+ ```
737
+
738
+ ## Testing
739
+
740
+ ### Unit Test (Service)
741
+
742
+ ```typescript
743
+ // src/modules/users/users.service.spec.ts
744
+ import { Test, TestingModule } from '@nestjs/testing';
745
+ import { getRepositoryToken } from '@nestjs/typeorm';
746
+ import { Repository } from 'typeorm';
747
+ import { UsersService } from './users.service';
748
+ import { User } from './entities/user.entity';
749
+ import { NotFoundException, ConflictException } from '@nestjs/common';
750
+
751
+ describe('UsersService', () => {
752
+ let service: UsersService;
753
+ let repo: jest.Mocked<Repository<User>>;
754
+
755
+ beforeEach(async () => {
756
+ const module: TestingModule = await Test.createTestingModule({
757
+ providers: [
758
+ UsersService,
759
+ {
760
+ provide: getRepositoryToken(User),
761
+ useValue: {
762
+ findOne: jest.fn(),
763
+ findAndCount: jest.fn(),
764
+ create: jest.fn(),
765
+ save: jest.fn(),
766
+ delete: jest.fn(),
767
+ },
768
+ },
769
+ ],
770
+ }).compile();
771
+
772
+ service = module.get(UsersService);
773
+ repo = module.get(getRepositoryToken(User));
774
+ });
775
+
776
+ describe('findOneOrFail', () => {
777
+ it('returns user when found', async () => {
778
+ const user = { id: '1', name: 'John', email: 'john@test.com' } as User;
779
+ repo.findOne.mockResolvedValue(user);
780
+
781
+ const result = await service.findOneOrFail('1');
782
+ expect(result).toEqual(user);
783
+ });
784
+
785
+ it('throws NotFoundException when user does not exist', async () => {
786
+ repo.findOne.mockResolvedValue(null);
787
+
788
+ await expect(service.findOneOrFail('999')).rejects.toThrow(NotFoundException);
789
+ });
790
+ });
791
+
792
+ describe('create', () => {
793
+ it('throws ConflictException when email exists', async () => {
794
+ repo.findOne.mockResolvedValue({ id: '1' } as User);
795
+
796
+ await expect(
797
+ service.create({ name: 'Test', email: 'exists@test.com', password: 'password123' }),
798
+ ).rejects.toThrow(ConflictException);
799
+ });
800
+ });
801
+ });
802
+ ```
803
+
804
+ ### E2E Test
805
+
806
+ ```typescript
807
+ // test/users.e2e-spec.ts
808
+ import { Test, TestingModule } from '@nestjs/testing';
809
+ import { INestApplication, ValidationPipe } from '@nestjs/common';
810
+ import * as request from 'supertest';
811
+ import { AppModule } from '../src/app.module';
812
+
813
+ describe('Users (e2e)', () => {
814
+ let app: INestApplication;
815
+ let authToken: string;
816
+
817
+ beforeAll(async () => {
818
+ const module: TestingModule = await Test.createTestingModule({
819
+ imports: [AppModule],
820
+ }).compile();
821
+
822
+ app = module.createNestApplication();
823
+ app.useGlobalPipes(new ValidationPipe({ whitelist: true, transform: true }));
824
+ await app.init();
825
+
826
+ // Get auth token
827
+ const loginRes = await request(app.getHttpServer())
828
+ .post('/auth/login')
829
+ .send({ email: 'admin@test.com', password: 'password' });
830
+ authToken = loginRes.body.access_token;
831
+ });
832
+
833
+ afterAll(async () => {
834
+ await app.close();
835
+ });
836
+
837
+ it('POST /users - creates a user', async () => {
838
+ const res = await request(app.getHttpServer())
839
+ .post('/users')
840
+ .send({ name: 'New User', email: 'new@test.com', password: 'password123' })
841
+ .expect(201);
842
+
843
+ expect(res.body).toHaveProperty('id');
844
+ expect(res.body.email).toBe('new@test.com');
845
+ expect(res.body).not.toHaveProperty('password');
846
+ });
847
+
848
+ it('GET /users - requires authentication', async () => {
849
+ await request(app.getHttpServer()).get('/users').expect(401);
850
+ });
851
+
852
+ it('GET /users - returns paginated users', async () => {
853
+ const res = await request(app.getHttpServer())
854
+ .get('/users?page=1&limit=10')
855
+ .set('Authorization', `Bearer ${authToken}`)
856
+ .expect(200);
857
+
858
+ expect(res.body).toHaveProperty('data');
859
+ expect(res.body).toHaveProperty('total');
860
+ expect(Array.isArray(res.body.data)).toBe(true);
861
+ });
862
+ });
863
+ ```
864
+
865
+ ## Anti-Patterns
866
+
867
+ | Anti-Pattern | Correct Approach |
868
+ |-------------|-----------------|
869
+ | Injecting `Repository` directly into controllers | Controllers call services, services use repositories |
870
+ | Using `any` types for request/response | Define DTOs with class-validator decorators |
871
+ | Putting business logic in controllers | Controllers handle HTTP; services contain logic |
872
+ | Not using `ValidationPipe` globally | Set it in `main.ts` to validate all incoming DTOs |
873
+ | Creating circular module dependencies | Extract shared logic into a common module |
874
+ | Not using `@Exclude()` on sensitive entity fields | Password, tokens, internal IDs should never be serialized |
875
+ | Catching all exceptions in controllers | Use exception filters for centralized error handling |
876
+ | Using `@Res()` decorator (bypasses interceptors) | Return values from handlers; NestJS serializes them |
877
+ | Not splitting large modules | One module per bounded context / domain area |
878
+ | Hardcoding config values | Use `ConfigModule` and `ConfigService` for all environment values |