@su-record/vibe 2.8.52 → 2.9.1

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 (426) hide show
  1. package/.env.example +37 -37
  2. package/CLAUDE.md +169 -169
  3. package/LICENSE +21 -21
  4. package/README.ko.md +43 -128
  5. package/README.md +43 -128
  6. package/agents/architect-low.md +41 -41
  7. package/agents/architect-medium.md +59 -59
  8. package/agents/architect.md +80 -80
  9. package/agents/build-error-resolver.md +115 -115
  10. package/agents/compounder.md +261 -261
  11. package/agents/diagrammer.md +178 -178
  12. package/agents/docs/api-documenter.md +99 -99
  13. package/agents/docs/changelog-writer.md +93 -93
  14. package/agents/e2e-tester.md +294 -294
  15. package/agents/event/event-comms.md +78 -78
  16. package/agents/event/event-content.md +68 -68
  17. package/agents/event/event-image.md +95 -95
  18. package/agents/event/event-ops.md +84 -84
  19. package/agents/event/event-scheduler.md +69 -69
  20. package/agents/event/event-speaker.md +86 -86
  21. package/agents/explorer-low.md +42 -42
  22. package/agents/explorer-medium.md +59 -59
  23. package/agents/explorer.md +48 -48
  24. package/agents/implementer-low.md +43 -43
  25. package/agents/implementer-medium.md +52 -52
  26. package/agents/implementer.md +54 -54
  27. package/agents/junior-mentor.md +141 -141
  28. package/agents/planning/requirements-analyst.md +84 -84
  29. package/agents/planning/ux-advisor.md +83 -83
  30. package/agents/qa/acceptance-tester.md +86 -86
  31. package/agents/qa/edge-case-finder.md +93 -93
  32. package/agents/qa/qa-coordinator.md +131 -131
  33. package/agents/refactor-cleaner.md +143 -143
  34. package/agents/research/best-practices-agent.md +199 -199
  35. package/agents/research/codebase-patterns-agent.md +157 -157
  36. package/agents/research/framework-docs-agent.md +188 -188
  37. package/agents/research/security-advisory-agent.md +213 -213
  38. package/agents/review/architecture-reviewer.md +107 -107
  39. package/agents/review/complexity-reviewer.md +116 -116
  40. package/agents/review/data-integrity-reviewer.md +88 -88
  41. package/agents/review/git-history-reviewer.md +103 -103
  42. package/agents/review/performance-reviewer.md +86 -86
  43. package/agents/review/python-reviewer.md +150 -150
  44. package/agents/review/rails-reviewer.md +139 -139
  45. package/agents/review/react-reviewer.md +144 -144
  46. package/agents/review/security-reviewer.md +80 -80
  47. package/agents/review/simplicity-reviewer.md +140 -140
  48. package/agents/review/test-coverage-reviewer.md +116 -116
  49. package/agents/review/typescript-reviewer.md +127 -127
  50. package/agents/searcher.md +54 -54
  51. package/agents/simplifier.md +120 -120
  52. package/agents/tester.md +49 -49
  53. package/agents/ui/ui-a11y-auditor.md +93 -93
  54. package/agents/ui/ui-antipattern-detector.md +102 -102
  55. package/agents/ui/ui-dataviz-advisor.md +69 -69
  56. package/agents/ui/ui-design-system-gen.md +57 -57
  57. package/agents/ui/ui-industry-analyzer.md +49 -49
  58. package/agents/ui/ui-layout-architect.md +65 -65
  59. package/agents/ui/ui-stack-implementer.md +68 -68
  60. package/agents/ui/ux-compliance-reviewer.md +81 -81
  61. package/agents/ui-previewer.md +258 -258
  62. package/commands/vibe.analyze.md +379 -379
  63. package/commands/vibe.docs.md +32 -32
  64. package/commands/vibe.event.md +163 -163
  65. package/commands/vibe.figma.md +69 -69
  66. package/commands/vibe.review.md +686 -686
  67. package/commands/vibe.run.md +2276 -2276
  68. package/commands/vibe.spec.md +1195 -1195
  69. package/commands/vibe.spec.review.md +609 -609
  70. package/commands/vibe.trace.md +259 -259
  71. package/commands/vibe.utils.md +413 -413
  72. package/commands/vibe.verify.md +510 -510
  73. package/dist/cli/collaborator.js +52 -52
  74. package/dist/cli/commands/config.js +9 -9
  75. package/dist/cli/commands/evolution.js +12 -12
  76. package/dist/cli/commands/figma.js +20 -20
  77. package/dist/cli/commands/info.js +53 -53
  78. package/dist/cli/commands/init.js +5 -5
  79. package/dist/cli/commands/remove.js +14 -14
  80. package/dist/cli/commands/sentinel.js +27 -27
  81. package/dist/cli/commands/skills.js +5 -5
  82. package/dist/cli/commands/slack.js +10 -10
  83. package/dist/cli/commands/stats.js +6 -6
  84. package/dist/cli/commands/telegram.js +12 -12
  85. package/dist/cli/detect.js +32 -32
  86. package/dist/cli/index.js +51 -51
  87. package/dist/cli/llm/claude-commands.js +16 -16
  88. package/dist/cli/llm/config.js +18 -18
  89. package/dist/cli/llm/gemini-commands.js +16 -16
  90. package/dist/cli/llm/gpt-commands.js +19 -19
  91. package/dist/cli/llm/help.js +21 -21
  92. package/dist/cli/postinstall/cursor-agents.js +32 -32
  93. package/dist/cli/postinstall/cursor-rules.js +83 -83
  94. package/dist/cli/postinstall/cursor-skills.js +743 -743
  95. package/dist/cli/postinstall/main.d.ts.map +1 -1
  96. package/dist/cli/postinstall/main.js +40 -66
  97. package/dist/cli/postinstall/main.js.map +1 -1
  98. package/dist/cli/setup/Provisioner.js +42 -42
  99. package/dist/infra/lib/CostAccumulator.d.ts +58 -0
  100. package/dist/infra/lib/CostAccumulator.d.ts.map +1 -0
  101. package/dist/infra/lib/CostAccumulator.js +131 -0
  102. package/dist/infra/lib/CostAccumulator.js.map +1 -0
  103. package/dist/infra/lib/DeepInit.js +24 -24
  104. package/dist/infra/lib/IterationTracker.js +11 -11
  105. package/dist/infra/lib/PythonParser.js +108 -108
  106. package/dist/infra/lib/ReviewRace.js +96 -96
  107. package/dist/infra/lib/SkillFrontmatter.js +28 -28
  108. package/dist/infra/lib/SkillQualityGate.js +9 -9
  109. package/dist/infra/lib/SkillRepository.js +159 -159
  110. package/dist/infra/lib/TokenBudgetTracker.d.ts +13 -0
  111. package/dist/infra/lib/TokenBudgetTracker.d.ts.map +1 -1
  112. package/dist/infra/lib/TokenBudgetTracker.js +44 -3
  113. package/dist/infra/lib/TokenBudgetTracker.js.map +1 -1
  114. package/dist/infra/lib/UltraQA.js +99 -99
  115. package/dist/infra/lib/autonomy/AuditStore.js +41 -41
  116. package/dist/infra/lib/autonomy/ConfirmationStore.js +30 -30
  117. package/dist/infra/lib/autonomy/EventOutbox.js +38 -38
  118. package/dist/infra/lib/autonomy/PolicyEngine.d.ts +3 -3
  119. package/dist/infra/lib/autonomy/PolicyEngine.js +18 -18
  120. package/dist/infra/lib/autonomy/SecuritySentinel.js +1 -1
  121. package/dist/infra/lib/autonomy/SuggestionStore.js +33 -33
  122. package/dist/infra/lib/embedding/VectorStore.js +22 -22
  123. package/dist/infra/lib/evolution/AgentAnalyzer.js +10 -10
  124. package/dist/infra/lib/evolution/DescriptionOptimizer.js +21 -21
  125. package/dist/infra/lib/evolution/GenerationRegistry.js +36 -36
  126. package/dist/infra/lib/evolution/InsightStore.js +90 -90
  127. package/dist/infra/lib/evolution/ParityTester.js +57 -57
  128. package/dist/infra/lib/evolution/RollbackManager.js +5 -5
  129. package/dist/infra/lib/evolution/SkillBenchmark.js +23 -23
  130. package/dist/infra/lib/evolution/SkillEvalRunner.js +50 -50
  131. package/dist/infra/lib/evolution/SkillGapDetector.js +10 -10
  132. package/dist/infra/lib/evolution/UsageTracker.js +28 -28
  133. package/dist/infra/lib/gemini/orchestration.js +5 -5
  134. package/dist/infra/lib/gpt/orchestration.js +4 -4
  135. package/dist/infra/lib/memory/KnowledgeGraph.js +4 -4
  136. package/dist/infra/lib/memory/MemorySearch.js +57 -57
  137. package/dist/infra/lib/memory/MemoryStorage.js +181 -181
  138. package/dist/infra/lib/memory/ObservationStore.js +28 -28
  139. package/dist/infra/lib/memory/ReflectionStore.js +30 -30
  140. package/dist/infra/lib/memory/SessionRAGRetriever.js +7 -7
  141. package/dist/infra/lib/memory/SessionRAGStore.js +225 -225
  142. package/dist/infra/lib/memory/SessionSummarizer.js +9 -9
  143. package/dist/infra/orchestrator/AgentManager.js +12 -12
  144. package/dist/infra/orchestrator/AgentRegistry.js +65 -65
  145. package/dist/infra/orchestrator/MultiLlmResearch.js +8 -8
  146. package/dist/infra/orchestrator/SwarmOrchestrator.test.js +16 -16
  147. package/dist/infra/orchestrator/parallelResearch.js +24 -24
  148. package/dist/tools/convention/analyzeComplexity.test.js +115 -115
  149. package/dist/tools/convention/validateCodeQuality.test.js +104 -104
  150. package/dist/tools/memory/createMemoryTimeline.js +10 -10
  151. package/dist/tools/memory/getMemoryGraph.js +12 -12
  152. package/dist/tools/memory/getSessionContext.js +9 -9
  153. package/dist/tools/memory/linkMemories.js +14 -14
  154. package/dist/tools/memory/listMemories.js +4 -4
  155. package/dist/tools/memory/recallMemory.js +4 -4
  156. package/dist/tools/memory/saveMemory.js +4 -4
  157. package/dist/tools/memory/searchMemoriesAdvanced.js +23 -23
  158. package/dist/tools/semantic/analyzeDependencyGraph.js +12 -12
  159. package/dist/tools/semantic/astGrep.test.js +6 -6
  160. package/dist/tools/spec/prdParser.test.js +171 -171
  161. package/dist/tools/spec/specGenerator.js +169 -169
  162. package/dist/tools/spec/traceabilityMatrix.js +64 -64
  163. package/dist/tools/spec/traceabilityMatrix.test.js +28 -28
  164. package/hooks/gemini-hooks.json +73 -73
  165. package/hooks/hooks.json +174 -174
  166. package/hooks/scripts/__tests__/keyword-detector.test.js +199 -199
  167. package/hooks/scripts/__tests__/pre-tool-guard.test.js +286 -286
  168. package/hooks/scripts/__tests__/sentinel-guard.test.js +210 -210
  169. package/hooks/scripts/auto-commit.js +97 -97
  170. package/hooks/scripts/auto-format.js +64 -64
  171. package/hooks/scripts/auto-test.js +81 -81
  172. package/hooks/scripts/code-check.js +268 -268
  173. package/hooks/scripts/codex-detect.js +46 -46
  174. package/hooks/scripts/codex-review-gate.js +80 -80
  175. package/hooks/scripts/command-log.js +32 -32
  176. package/hooks/scripts/context-save.js +353 -353
  177. package/hooks/scripts/evolution-engine.js +91 -91
  178. package/hooks/scripts/figma-extract.js +635 -477
  179. package/hooks/scripts/hud-status.js +321 -321
  180. package/hooks/scripts/keyword-detector.js +214 -214
  181. package/hooks/scripts/llm-orchestrate.js +572 -572
  182. package/hooks/scripts/post-edit.js +32 -32
  183. package/hooks/scripts/pr-test-gate.js +52 -52
  184. package/hooks/scripts/pre-tool-guard.js +214 -159
  185. package/hooks/scripts/prompt-dispatcher.js +185 -185
  186. package/hooks/scripts/sentinel-guard.js +131 -131
  187. package/hooks/scripts/session-start.js +177 -177
  188. package/hooks/scripts/skill-injector.js +83 -83
  189. package/hooks/scripts/stop-notify.js +209 -209
  190. package/hooks/scripts/utils.js +243 -243
  191. package/languages/csharp-unity.md +515 -515
  192. package/languages/gdscript-godot.md +470 -470
  193. package/languages/ruby-rails.md +489 -489
  194. package/languages/typescript-angular.md +433 -433
  195. package/languages/typescript-astro.md +416 -416
  196. package/languages/typescript-electron.md +406 -406
  197. package/languages/typescript-nestjs.md +524 -524
  198. package/languages/typescript-svelte.md +407 -407
  199. package/languages/typescript-tauri.md +365 -365
  200. package/package.json +101 -101
  201. package/skills/agents-md/SKILL.md +121 -121
  202. package/skills/agents-md/rubrics/what-to-keep.md +49 -49
  203. package/skills/agents-md/templates/agents-md.md +36 -36
  204. package/skills/arch-guard/SKILL.md +181 -181
  205. package/skills/arch-guard/agents/detector.md +48 -48
  206. package/skills/arch-guard/agents/reporter.md +48 -48
  207. package/skills/arch-guard/agents/rule-generator.md +49 -49
  208. package/skills/arch-guard/agents/violation-checker.md +51 -51
  209. package/skills/arch-guard/frameworks/clean-architecture.md +108 -108
  210. package/skills/arch-guard/frameworks/solid.md +102 -102
  211. package/skills/arch-guard/scripts/check-boundaries.js +90 -90
  212. package/skills/arch-guard/templates/arch-rules.json +47 -47
  213. package/skills/arch-guard/templates/violation-report.md +53 -53
  214. package/skills/brand-assets/SKILL.md +147 -147
  215. package/skills/brand-assets/rubrics/asset-checklist.md +98 -98
  216. package/skills/brand-assets/templates/brand-guide.md +161 -161
  217. package/skills/capability-loop/SKILL.md +168 -168
  218. package/skills/capability-loop/agents/capability-designer.md +61 -61
  219. package/skills/capability-loop/agents/failure-analyst.md +55 -55
  220. package/skills/capability-loop/agents/implementer.md +50 -50
  221. package/skills/capability-loop/agents/tester.md +53 -53
  222. package/skills/capability-loop/templates/capability-spec.md +118 -118
  223. package/skills/capability-loop/templates/failure-analysis.md +118 -118
  224. package/skills/characterization-test/SKILL.md +207 -207
  225. package/skills/characterization-test/agents/behavior-capturer.md +50 -50
  226. package/skills/characterization-test/agents/coverage-checker.md +54 -54
  227. package/skills/characterization-test/agents/reporter.md +50 -50
  228. package/skills/characterization-test/agents/test-writer.md +49 -49
  229. package/skills/characterization-test/rubrics/coverage-criteria.md +53 -53
  230. package/skills/characterization-test/templates/test-template.ts +101 -101
  231. package/skills/chub-usage/SKILL.md +139 -139
  232. package/skills/claude-md-guide/SKILL.md +351 -351
  233. package/skills/claude-md-guide/rubrics/anti-patterns.md +88 -88
  234. package/skills/claude-md-guide/templates/claude-md.md +54 -54
  235. package/skills/commerce-patterns/SKILL.md +64 -64
  236. package/skills/commerce-patterns/rubrics/checkout-flow.md +48 -48
  237. package/skills/commerce-patterns/templates/product-schema.md +85 -85
  238. package/skills/commit-push-pr/SKILL.md +77 -77
  239. package/skills/commit-push-pr/agents/change-analyzer.md +55 -55
  240. package/skills/commit-push-pr/agents/message-writer.md +50 -50
  241. package/skills/commit-push-pr/agents/pr-writer.md +58 -58
  242. package/skills/commit-push-pr/agents/reviewer.md +52 -52
  243. package/skills/commit-push-pr/rubrics/commit-message.md +73 -73
  244. package/skills/commit-push-pr/templates/pr-body.md +63 -63
  245. package/skills/context7-usage/SKILL.md +106 -106
  246. package/skills/context7-usage/rubrics/when-to-use.md +50 -50
  247. package/skills/create-prd/SKILL.md +90 -90
  248. package/skills/create-prd/agents/edge-case-finder.md +48 -48
  249. package/skills/create-prd/agents/prioritizer.md +60 -60
  250. package/skills/create-prd/agents/requirements-writer.md +48 -48
  251. package/skills/create-prd/agents/researcher.md +55 -55
  252. package/skills/create-prd/agents/reviewer.md +54 -54
  253. package/skills/create-prd/frameworks/jobs-to-be-done.md +96 -96
  254. package/skills/create-prd/frameworks/rice-scoring.md +97 -97
  255. package/skills/create-prd/orchestrator.md +70 -70
  256. package/skills/create-prd/rubrics/completeness.md +58 -58
  257. package/skills/create-prd/templates/prd.md +139 -139
  258. package/skills/design-audit/SKILL.md +152 -152
  259. package/skills/design-audit/agents/a11y-auditor.md +43 -43
  260. package/skills/design-audit/agents/performance-auditor.md +46 -46
  261. package/skills/design-audit/agents/responsive-auditor.md +46 -46
  262. package/skills/design-audit/agents/scorer.md +47 -47
  263. package/skills/design-audit/agents/slop-detector.md +47 -47
  264. package/skills/design-audit/frameworks/core-web-vitals.md +107 -107
  265. package/skills/design-audit/frameworks/wcag-checklist.md +64 -64
  266. package/skills/design-audit/orchestrator.md +64 -64
  267. package/skills/design-audit/rubrics/ai-slop-patterns.md +83 -83
  268. package/skills/design-audit/rubrics/scoring.md +63 -63
  269. package/skills/design-audit/templates/report.md +88 -88
  270. package/skills/design-critique/SKILL.md +139 -139
  271. package/skills/design-critique/rubrics/ux-heuristics.md +143 -143
  272. package/skills/design-critique/templates/critique-report.md +86 -86
  273. package/skills/design-distill/SKILL.md +130 -130
  274. package/skills/design-distill/templates/design-system.md +132 -132
  275. package/skills/design-normalize/SKILL.md +133 -133
  276. package/skills/design-normalize/rubrics/token-naming.md +117 -117
  277. package/skills/design-normalize/templates/token-audit.md +89 -89
  278. package/skills/design-polish/SKILL.md +131 -131
  279. package/skills/design-polish/rubrics/polish-checklist.md +68 -68
  280. package/skills/design-polish/templates/polish-report.md +64 -64
  281. package/skills/design-teach/SKILL.md +182 -182
  282. package/skills/design-teach/rubrics/brand-personality.md +73 -73
  283. package/skills/design-teach/templates/design-context.json +36 -36
  284. package/skills/e2e-commerce/SKILL.md +62 -62
  285. package/skills/e2e-commerce/templates/test-scenarios.md +170 -170
  286. package/skills/event-comms/SKILL.md +162 -162
  287. package/skills/event-comms/templates/email-invite.md +99 -99
  288. package/skills/event-comms/templates/sns-post.md +133 -133
  289. package/skills/event-ops/SKILL.md +198 -198
  290. package/skills/event-ops/rubrics/contingency.md +85 -85
  291. package/skills/event-ops/templates/d-day-checklist.md +65 -65
  292. package/skills/event-planning/SKILL.md +132 -132
  293. package/skills/event-planning/rubrics/timeline.md +70 -70
  294. package/skills/event-planning/templates/event-plan.md +91 -91
  295. package/skills/exec-plan/SKILL.md +149 -149
  296. package/skills/exec-plan/agents/decomposer.md +47 -47
  297. package/skills/exec-plan/agents/dependency-mapper.md +44 -44
  298. package/skills/exec-plan/agents/estimator.md +43 -43
  299. package/skills/exec-plan/agents/validator.md +55 -55
  300. package/skills/exec-plan/orchestrator.md +70 -70
  301. package/skills/exec-plan/rubrics/complexity-scoring.md +75 -75
  302. package/skills/exec-plan/templates/plan.md +147 -147
  303. package/skills/git-worktree/SKILL.md +73 -73
  304. package/skills/git-worktree/rubrics/when-to-use.md +55 -55
  305. package/skills/handoff/SKILL.md +110 -110
  306. package/skills/handoff/agents/context-summarizer.md +51 -51
  307. package/skills/handoff/agents/document-writer.md +63 -63
  308. package/skills/handoff/agents/state-collector.md +53 -53
  309. package/skills/handoff/agents/verifier.md +48 -48
  310. package/skills/handoff/rubrics/completeness.md +62 -62
  311. package/skills/handoff/templates/handoff.md +107 -107
  312. package/skills/parallel-research/SKILL.md +89 -89
  313. package/skills/parallel-research/agents/best-practices.md +43 -43
  314. package/skills/parallel-research/agents/codebase-patterns.md +46 -46
  315. package/skills/parallel-research/agents/framework-docs.md +45 -45
  316. package/skills/parallel-research/agents/security-advisory.md +46 -46
  317. package/skills/parallel-research/agents/synthesizer.md +52 -52
  318. package/skills/parallel-research/experts/best-practices.md +50 -50
  319. package/skills/parallel-research/experts/codebase-patterns.md +70 -70
  320. package/skills/parallel-research/experts/framework-docs.md +65 -65
  321. package/skills/parallel-research/experts/security-advisory.md +69 -69
  322. package/skills/parallel-research/orchestrator.md +65 -65
  323. package/skills/parallel-research/templates/synthesis.md +101 -101
  324. package/skills/prioritization-frameworks/SKILL.md +87 -87
  325. package/skills/prioritization-frameworks/rubrics/frameworks.md +79 -79
  326. package/skills/prioritization-frameworks/templates/scoring-matrix.md +69 -69
  327. package/skills/priority-todos/SKILL.md +64 -64
  328. package/skills/priority-todos/rubrics/prioritization.md +70 -70
  329. package/skills/priority-todos/templates/todo-board.md +59 -59
  330. package/skills/seo-checklist/SKILL.md +58 -58
  331. package/skills/seo-checklist/frameworks/structured-data.md +153 -153
  332. package/skills/seo-checklist/rubrics/content-seo.md +42 -42
  333. package/skills/seo-checklist/rubrics/technical-seo.md +48 -48
  334. package/skills/techdebt/SKILL.md +124 -124
  335. package/skills/techdebt/agents/analyzer.md +50 -50
  336. package/skills/techdebt/agents/fixer.md +41 -41
  337. package/skills/techdebt/agents/reviewer.md +47 -47
  338. package/skills/techdebt/agents/scanner.md +44 -44
  339. package/skills/techdebt/orchestrator.md +70 -70
  340. package/skills/techdebt/rubrics/severity.md +51 -51
  341. package/skills/techdebt/scripts/scan.js +90 -90
  342. package/skills/techdebt/templates/report.md +86 -86
  343. package/skills/tool-fallback/SKILL.md +104 -104
  344. package/skills/tool-fallback/rubrics/fallback-chain.md +58 -58
  345. package/skills/typescript-advanced-types/SKILL.md +67 -67
  346. package/skills/typescript-advanced-types/rubrics/type-patterns.md +109 -109
  347. package/skills/ui-ux-pro-max/SKILL.md +236 -236
  348. package/skills/ui-ux-pro-max/reference/color-and-contrast.md +517 -517
  349. package/skills/ui-ux-pro-max/reference/interaction-design.md +544 -544
  350. package/skills/ui-ux-pro-max/reference/motion-design.md +591 -591
  351. package/skills/ui-ux-pro-max/reference/responsive-design.md +463 -463
  352. package/skills/ui-ux-pro-max/reference/spatial-design.md +390 -390
  353. package/skills/ui-ux-pro-max/reference/typography.md +455 -455
  354. package/skills/ui-ux-pro-max/reference/ux-writing.md +469 -469
  355. package/skills/ui-ux-pro-max/rubrics/interaction-states.md +83 -83
  356. package/skills/ui-ux-pro-max/rubrics/responsive-breakpoints.md +99 -99
  357. package/skills/user-personas/SKILL.md +75 -75
  358. package/skills/user-personas/rubrics/research-methods.md +56 -56
  359. package/skills/user-personas/templates/persona.md +89 -89
  360. package/skills/vercel-react-best-practices/SKILL.md +60 -60
  361. package/skills/vercel-react-best-practices/rubrics/performance.md +82 -82
  362. package/skills/vercel-react-best-practices/rubrics/server-components.md +86 -86
  363. package/skills/vibe.docs/SKILL.md +171 -171
  364. package/skills/vibe.docs/templates/architecture.md +80 -80
  365. package/skills/vibe.docs/templates/readme.md +84 -84
  366. package/skills/vibe.docs/templates/release-notes.md +74 -74
  367. package/skills/vibe.figma/SKILL.md +215 -982
  368. package/skills/vibe.figma/rubrics/extraction-checklist.md +51 -51
  369. package/skills/vibe.figma/templates/component-index.md +126 -126
  370. package/skills/vibe.figma/templates/figma-handoff.md +100 -100
  371. package/skills/vibe.figma/templates/remapped-tree.md +277 -277
  372. package/skills/vibe.figma.convert/SKILL.md +188 -511
  373. package/skills/vibe.figma.convert/rubrics/conversion-rules.md +129 -113
  374. package/skills/vibe.figma.convert/templates/component.md +140 -140
  375. package/skills/vibe.figma.extract/SKILL.md +179 -300
  376. package/skills/vibe.figma.extract/rubrics/image-rules.md +145 -137
  377. package/skills/video-production/SKILL.md +52 -52
  378. package/skills/video-production/rubrics/quality-checklist.md +58 -58
  379. package/skills/video-production/templates/production-plan.md +104 -104
  380. package/vibe/config.json +29 -29
  381. package/vibe/constitution.md +227 -227
  382. package/vibe/rules/principles/communication-guide.md +98 -98
  383. package/vibe/rules/principles/development-philosophy.md +52 -52
  384. package/vibe/rules/principles/quick-start.md +102 -102
  385. package/vibe/rules/quality/bdd-contract-testing.md +393 -393
  386. package/vibe/rules/quality/checklist.md +276 -276
  387. package/vibe/rules/quality/performance.md +236 -236
  388. package/vibe/rules/quality/testing-strategy.md +440 -440
  389. package/vibe/rules/standards/anti-patterns.md +541 -541
  390. package/vibe/rules/standards/code-structure.md +291 -291
  391. package/vibe/rules/standards/complexity-metrics.md +313 -313
  392. package/vibe/rules/standards/git-workflow.md +237 -237
  393. package/vibe/rules/standards/naming-conventions.md +198 -198
  394. package/vibe/rules/standards/security.md +305 -305
  395. package/vibe/rules/writing/document-style.md +74 -74
  396. package/vibe/setup.sh +31 -31
  397. package/vibe/templates/constitution-template.md +252 -252
  398. package/vibe/templates/contract-backend-template.md +526 -526
  399. package/vibe/templates/contract-frontend-template.md +599 -599
  400. package/vibe/templates/feature-template.md +96 -96
  401. package/vibe/templates/spec-template.md +221 -221
  402. package/vibe/ui-ux-data/charts.csv +26 -26
  403. package/vibe/ui-ux-data/colors.csv +97 -97
  404. package/vibe/ui-ux-data/icons.csv +101 -101
  405. package/vibe/ui-ux-data/landing.csv +31 -31
  406. package/vibe/ui-ux-data/products.csv +96 -96
  407. package/vibe/ui-ux-data/react-performance.csv +45 -45
  408. package/vibe/ui-ux-data/stacks/astro.csv +54 -54
  409. package/vibe/ui-ux-data/stacks/flutter.csv +53 -53
  410. package/vibe/ui-ux-data/stacks/html-tailwind.csv +56 -56
  411. package/vibe/ui-ux-data/stacks/jetpack-compose.csv +53 -53
  412. package/vibe/ui-ux-data/stacks/nextjs.csv +53 -53
  413. package/vibe/ui-ux-data/stacks/nuxt-ui.csv +51 -51
  414. package/vibe/ui-ux-data/stacks/nuxtjs.csv +59 -59
  415. package/vibe/ui-ux-data/stacks/react-native.csv +52 -52
  416. package/vibe/ui-ux-data/stacks/react.csv +54 -54
  417. package/vibe/ui-ux-data/stacks/shadcn.csv +61 -61
  418. package/vibe/ui-ux-data/stacks/svelte.csv +54 -54
  419. package/vibe/ui-ux-data/stacks/swiftui.csv +51 -51
  420. package/vibe/ui-ux-data/stacks/vue.csv +50 -50
  421. package/vibe/ui-ux-data/styles.csv +68 -68
  422. package/vibe/ui-ux-data/typography.csv +57 -57
  423. package/vibe/ui-ux-data/ui-reasoning.csv +101 -101
  424. package/vibe/ui-ux-data/ux-guidelines.csv +99 -99
  425. package/vibe/ui-ux-data/version.json +31 -31
  426. package/vibe/ui-ux-data/web-interface.csv +31 -31
@@ -1,524 +1,524 @@
1
- # 🐱 TypeScript + NestJS Quality Rules
2
-
3
- ## Core Principles (inherited from core)
4
-
5
- ```markdown
6
- ✅ Single Responsibility (SRP)
7
- ✅ Don't Repeat Yourself (DRY)
8
- ✅ Reusability
9
- ✅ Low Complexity
10
- ✅ Functions ≤ 30 lines
11
- ✅ Nesting ≤ 3 levels
12
- ✅ Cyclomatic complexity ≤ 10
13
- ```
14
-
15
- ## NestJS Architecture
16
-
17
- ```
18
- ┌─────────────────────────────────────────────┐
19
- │ Controller (HTTP Request Handling) │
20
- │ - Routing, request validation, response │
21
- ├─────────────────────────────────────────────┤
22
- │ Service (Business Logic) │
23
- │ - Domain logic, data processing │
24
- ├─────────────────────────────────────────────┤
25
- │ Repository (Data Access) │
26
- │ - DB queries, ORM operations │
27
- └─────────────────────────────────────────────┘
28
- ```
29
-
30
- ## TypeScript/NestJS Patterns
31
-
32
- ### 1. Module Structure
33
-
34
- ```typescript
35
- // ✅ Feature Module
36
- @Module({
37
- imports: [
38
- TypeOrmModule.forFeature([User]),
39
- CommonModule,
40
- ],
41
- controllers: [UserController],
42
- providers: [UserService, UserRepository],
43
- exports: [UserService],
44
- })
45
- export class UserModule {}
46
-
47
- // ✅ Module folder structure
48
- // src/
49
- // ├── user/
50
- // │ ├── user.module.ts
51
- // │ ├── user.controller.ts
52
- // │ ├── user.service.ts
53
- // │ ├── user.repository.ts
54
- // │ ├── dto/
55
- // │ │ ├── create-user.dto.ts
56
- // │ │ └── update-user.dto.ts
57
- // │ └── entities/
58
- // │ └── user.entity.ts
59
- ```
60
-
61
- ### 2. Controller Pattern
62
-
63
- ```typescript
64
- // ✅ Controller
65
- @Controller('users')
66
- @ApiTags('users')
67
- export class UserController {
68
- constructor(private readonly userService: UserService) {}
69
-
70
- @Get()
71
- @ApiOperation({ summary: 'Get all users' })
72
- @ApiResponse({ status: 200, type: [UserResponseDto] })
73
- async findAll(@Query() query: FindUsersQueryDto): Promise<UserResponseDto[]> {
74
- return this.userService.findAll(query);
75
- }
76
-
77
- @Get(':id')
78
- @ApiOperation({ summary: 'Get user by ID' })
79
- @ApiResponse({ status: 200, type: UserResponseDto })
80
- @ApiResponse({ status: 404, description: 'User not found' })
81
- async findOne(@Param('id', ParseUUIDPipe) id: string): Promise<UserResponseDto> {
82
- return this.userService.findOne(id);
83
- }
84
-
85
- @Post()
86
- @ApiOperation({ summary: 'Create user' })
87
- @ApiResponse({ status: 201, type: UserResponseDto })
88
- async create(@Body() createUserDto: CreateUserDto): Promise<UserResponseDto> {
89
- return this.userService.create(createUserDto);
90
- }
91
-
92
- @Patch(':id')
93
- async update(
94
- @Param('id', ParseUUIDPipe) id: string,
95
- @Body() updateUserDto: UpdateUserDto,
96
- ): Promise<UserResponseDto> {
97
- return this.userService.update(id, updateUserDto);
98
- }
99
-
100
- @Delete(':id')
101
- @HttpCode(HttpStatus.NO_CONTENT)
102
- async remove(@Param('id', ParseUUIDPipe) id: string): Promise<void> {
103
- await this.userService.remove(id);
104
- }
105
- }
106
- ```
107
-
108
- ### 3. Service Pattern
109
-
110
- ```typescript
111
- // ✅ Service
112
- @Injectable()
113
- export class UserService {
114
- constructor(
115
- private readonly userRepository: UserRepository,
116
- private readonly eventEmitter: EventEmitter2,
117
- ) {}
118
-
119
- async findAll(query: FindUsersQueryDto): Promise<User[]> {
120
- return this.userRepository.findWithPagination(query);
121
- }
122
-
123
- async findOne(id: string): Promise<User> {
124
- const user = await this.userRepository.findById(id);
125
- if (!user) {
126
- throw new NotFoundException(`User with ID ${id} not found`);
127
- }
128
- return user;
129
- }
130
-
131
- async create(dto: CreateUserDto): Promise<User> {
132
- const existingUser = await this.userRepository.findByEmail(dto.email);
133
- if (existingUser) {
134
- throw new ConflictException('Email already exists');
135
- }
136
-
137
- const user = await this.userRepository.create(dto);
138
- this.eventEmitter.emit('user.created', new UserCreatedEvent(user));
139
- return user;
140
- }
141
-
142
- async update(id: string, dto: UpdateUserDto): Promise<User> {
143
- const user = await this.findOne(id);
144
- return this.userRepository.update(user.id, dto);
145
- }
146
-
147
- async remove(id: string): Promise<void> {
148
- const user = await this.findOne(id);
149
- await this.userRepository.softDelete(user.id);
150
- this.eventEmitter.emit('user.deleted', new UserDeletedEvent(user));
151
- }
152
- }
153
- ```
154
-
155
- ### 4. DTO + Validation
156
-
157
- ```typescript
158
- // ✅ Request DTO
159
- export class CreateUserDto {
160
- @ApiProperty({ example: 'john@example.com' })
161
- @IsEmail()
162
- @IsNotEmpty()
163
- email: string;
164
-
165
- @ApiProperty({ example: 'John Doe' })
166
- @IsString()
167
- @MinLength(2)
168
- @MaxLength(100)
169
- name: string;
170
-
171
- @ApiProperty({ example: 'password123' })
172
- @IsString()
173
- @MinLength(8)
174
- @Matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)/, {
175
- message: 'Password must contain uppercase, lowercase, and number',
176
- })
177
- password: string;
178
- }
179
-
180
- // ✅ Response DTO (only Expose fields are visible)
181
- @Exclude()
182
- export class UserResponseDto {
183
- @Expose()
184
- @ApiProperty()
185
- id: string;
186
-
187
- @Expose()
188
- @ApiProperty()
189
- email: string;
190
-
191
- @Expose()
192
- @ApiProperty()
193
- name: string;
194
-
195
- @Expose()
196
- @ApiProperty()
197
- createdAt: Date;
198
-
199
- // password is excluded
200
- }
201
-
202
- // ✅ Query DTO
203
- export class FindUsersQueryDto {
204
- @ApiPropertyOptional()
205
- @IsOptional()
206
- @IsString()
207
- search?: string;
208
-
209
- @ApiPropertyOptional({ default: 1 })
210
- @IsOptional()
211
- @Type(() => Number)
212
- @IsInt()
213
- @Min(1)
214
- page?: number = 1;
215
-
216
- @ApiPropertyOptional({ default: 10 })
217
- @IsOptional()
218
- @Type(() => Number)
219
- @IsInt()
220
- @Min(1)
221
- @Max(100)
222
- limit?: number = 10;
223
- }
224
- ```
225
-
226
- ### 5. Exception Handling
227
-
228
- ```typescript
229
- // ✅ Custom Exception Filter
230
- @Catch()
231
- export class AllExceptionsFilter implements ExceptionFilter {
232
- constructor(private readonly logger: Logger) {}
233
-
234
- catch(exception: unknown, host: ArgumentsHost): void {
235
- const ctx = host.switchToHttp();
236
- const response = ctx.getResponse<Response>();
237
- const request = ctx.getRequest<Request>();
238
-
239
- const { status, message } = this.getErrorDetails(exception);
240
-
241
- const errorResponse = {
242
- statusCode: status,
243
- timestamp: new Date().toISOString(),
244
- path: request.url,
245
- message,
246
- };
247
-
248
- this.logger.error(
249
- `${request.method} ${request.url} - ${status}`,
250
- exception instanceof Error ? exception.stack : undefined,
251
- );
252
-
253
- response.status(status).json(errorResponse);
254
- }
255
-
256
- private getErrorDetails(exception: unknown): { status: number; message: string } {
257
- if (exception instanceof HttpException) {
258
- return {
259
- status: exception.getStatus(),
260
- message: exception.message,
261
- };
262
- }
263
-
264
- return {
265
- status: HttpStatus.INTERNAL_SERVER_ERROR,
266
- message: 'Internal server error',
267
- };
268
- }
269
- }
270
-
271
- // ✅ Business Exception
272
- export class UserNotFoundException extends NotFoundException {
273
- constructor(userId: string) {
274
- super(`User with ID ${userId} not found`);
275
- }
276
- }
277
- ```
278
-
279
- ### 6. Guard & Interceptor
280
-
281
- ```typescript
282
- // ✅ Auth Guard
283
- @Injectable()
284
- export class JwtAuthGuard extends AuthGuard('jwt') {
285
- canActivate(context: ExecutionContext) {
286
- return super.canActivate(context);
287
- }
288
-
289
- handleRequest<T>(err: Error, user: T): T {
290
- if (err || !user) {
291
- throw err || new UnauthorizedException();
292
- }
293
- return user;
294
- }
295
- }
296
-
297
- // ✅ Role Guard
298
- @Injectable()
299
- export class RolesGuard implements CanActivate {
300
- constructor(private reflector: Reflector) {}
301
-
302
- canActivate(context: ExecutionContext): boolean {
303
- const requiredRoles = this.reflector.getAllAndOverride<Role[]>(
304
- ROLES_KEY,
305
- [context.getHandler(), context.getClass()],
306
- );
307
- if (!requiredRoles) {
308
- return true;
309
- }
310
- const { user } = context.switchToHttp().getRequest();
311
- return requiredRoles.some((role) => user.roles?.includes(role));
312
- }
313
- }
314
-
315
- // ✅ Transform Interceptor
316
- @Injectable()
317
- export class TransformInterceptor<T> implements NestInterceptor<T, Response<T>> {
318
- intercept(context: ExecutionContext, next: CallHandler): Observable<Response<T>> {
319
- return next.handle().pipe(
320
- map((data) => ({
321
- success: true,
322
- data,
323
- timestamp: new Date().toISOString(),
324
- })),
325
- );
326
- }
327
- }
328
- ```
329
-
330
- ### 7. Repository Pattern (TypeORM)
331
-
332
- ```typescript
333
- // ✅ Custom Repository
334
- @Injectable()
335
- export class UserRepository {
336
- constructor(
337
- @InjectRepository(User)
338
- private readonly repo: Repository<User>,
339
- ) {}
340
-
341
- async findById(id: string): Promise<User | null> {
342
- return this.repo.findOne({ where: { id } });
343
- }
344
-
345
- async findByEmail(email: string): Promise<User | null> {
346
- return this.repo.findOne({ where: { email } });
347
- }
348
-
349
- async findWithPagination(query: FindUsersQueryDto): Promise<User[]> {
350
- const { search, page, limit } = query;
351
- const qb = this.repo.createQueryBuilder('user');
352
-
353
- if (search) {
354
- qb.where('user.name ILIKE :search OR user.email ILIKE :search', {
355
- search: `%${search}%`,
356
- });
357
- }
358
-
359
- return qb
360
- .skip((page - 1) * limit)
361
- .take(limit)
362
- .orderBy('user.createdAt', 'DESC')
363
- .getMany();
364
- }
365
-
366
- async create(dto: CreateUserDto): Promise<User> {
367
- const user = this.repo.create(dto);
368
- return this.repo.save(user);
369
- }
370
-
371
- async update(id: string, dto: UpdateUserDto): Promise<User> {
372
- await this.repo.update(id, dto);
373
- return this.findById(id);
374
- }
375
-
376
- async softDelete(id: string): Promise<void> {
377
- await this.repo.softDelete(id);
378
- }
379
- }
380
- ```
381
-
382
- ### 8. Configuration
383
-
384
- ```typescript
385
- // ✅ Config Module
386
- @Module({
387
- imports: [
388
- ConfigModule.forRoot({
389
- isGlobal: true,
390
- validationSchema: Joi.object({
391
- NODE_ENV: Joi.string().valid('development', 'production', 'test').required(),
392
- PORT: Joi.number().default(3000),
393
- DATABASE_URL: Joi.string().required(),
394
- JWT_SECRET: Joi.string().required(),
395
- JWT_EXPIRES_IN: Joi.string().default('1d'),
396
- }),
397
- }),
398
- ],
399
- })
400
- export class AppConfigModule {}
401
-
402
- // ✅ Typed Config Service
403
- @Injectable()
404
- export class AppConfigService {
405
- constructor(private configService: ConfigService) {}
406
-
407
- get port(): number {
408
- return this.configService.get<number>('PORT', 3000);
409
- }
410
-
411
- get databaseUrl(): string {
412
- return this.configService.getOrThrow<string>('DATABASE_URL');
413
- }
414
-
415
- get jwtSecret(): string {
416
- return this.configService.getOrThrow<string>('JWT_SECRET');
417
- }
418
-
419
- get isProduction(): boolean {
420
- return this.configService.get('NODE_ENV') === 'production';
421
- }
422
- }
423
- ```
424
-
425
- ## Recommended Folder Structure
426
-
427
- ```
428
- src/
429
- ├── main.ts
430
- ├── app.module.ts
431
- ├── common/ # Shared module
432
- │ ├── decorators/
433
- │ ├── filters/
434
- │ ├── guards/
435
- │ ├── interceptors/
436
- │ ├── pipes/
437
- │ └── common.module.ts
438
- ├── config/ # Configuration
439
- │ ├── app.config.ts
440
- │ └── database.config.ts
441
- ├── user/ # Feature module
442
- │ ├── dto/
443
- │ ├── entities/
444
- │ ├── user.controller.ts
445
- │ ├── user.service.ts
446
- │ ├── user.repository.ts
447
- │ └── user.module.ts
448
- └── auth/
449
- ├── strategies/
450
- ├── guards/
451
- └── auth.module.ts
452
- ```
453
-
454
- ## Testing
455
-
456
- ```typescript
457
- // ✅ Unit Test
458
- describe('UserService', () => {
459
- let service: UserService;
460
- let repository: MockType<UserRepository>;
461
-
462
- beforeEach(async () => {
463
- const module = await Test.createTestingModule({
464
- providers: [
465
- UserService,
466
- {
467
- provide: UserRepository,
468
- useFactory: () => ({
469
- findById: jest.fn(),
470
- create: jest.fn(),
471
- }),
472
- },
473
- ],
474
- }).compile();
475
-
476
- service = module.get(UserService);
477
- repository = module.get(UserRepository);
478
- });
479
-
480
- it('should create a user', async () => {
481
- const dto = { email: 'test@test.com', name: 'Test' };
482
- repository.create.mockResolvedValue({ id: '1', ...dto });
483
-
484
- const result = await service.create(dto);
485
- expect(result.email).toBe(dto.email);
486
- });
487
- });
488
-
489
- // ✅ E2E Test
490
- describe('UserController (e2e)', () => {
491
- let app: INestApplication;
492
-
493
- beforeAll(async () => {
494
- const module = await Test.createTestingModule({
495
- imports: [AppModule],
496
- }).compile();
497
-
498
- app = module.createNestApplication();
499
- await app.init();
500
- });
501
-
502
- it('/users (GET)', () => {
503
- return request(app.getHttpServer())
504
- .get('/users')
505
- .expect(200)
506
- .expect((res) => {
507
- expect(Array.isArray(res.body)).toBe(true);
508
- });
509
- });
510
- });
511
- ```
512
-
513
- ## Checklist
514
-
515
- - [ ] Separate request/response types with DTOs
516
- - [ ] Validate with class-validator
517
- - [ ] Serialize with class-transformer
518
- - [ ] Use custom Exceptions
519
- - [ ] Apply Repository pattern
520
- - [ ] Handle auth/authorization with Guards
521
- - [ ] Transform responses with Interceptors
522
- - [ ] Validate environment variables with ConfigModule
523
- - [ ] Document API with Swagger
524
- - [ ] Write Unit + E2E tests
1
+ # 🐱 TypeScript + NestJS Quality Rules
2
+
3
+ ## Core Principles (inherited from core)
4
+
5
+ ```markdown
6
+ ✅ Single Responsibility (SRP)
7
+ ✅ Don't Repeat Yourself (DRY)
8
+ ✅ Reusability
9
+ ✅ Low Complexity
10
+ ✅ Functions ≤ 30 lines
11
+ ✅ Nesting ≤ 3 levels
12
+ ✅ Cyclomatic complexity ≤ 10
13
+ ```
14
+
15
+ ## NestJS Architecture
16
+
17
+ ```
18
+ ┌─────────────────────────────────────────────┐
19
+ │ Controller (HTTP Request Handling) │
20
+ │ - Routing, request validation, response │
21
+ ├─────────────────────────────────────────────┤
22
+ │ Service (Business Logic) │
23
+ │ - Domain logic, data processing │
24
+ ├─────────────────────────────────────────────┤
25
+ │ Repository (Data Access) │
26
+ │ - DB queries, ORM operations │
27
+ └─────────────────────────────────────────────┘
28
+ ```
29
+
30
+ ## TypeScript/NestJS Patterns
31
+
32
+ ### 1. Module Structure
33
+
34
+ ```typescript
35
+ // ✅ Feature Module
36
+ @Module({
37
+ imports: [
38
+ TypeOrmModule.forFeature([User]),
39
+ CommonModule,
40
+ ],
41
+ controllers: [UserController],
42
+ providers: [UserService, UserRepository],
43
+ exports: [UserService],
44
+ })
45
+ export class UserModule {}
46
+
47
+ // ✅ Module folder structure
48
+ // src/
49
+ // ├── user/
50
+ // │ ├── user.module.ts
51
+ // │ ├── user.controller.ts
52
+ // │ ├── user.service.ts
53
+ // │ ├── user.repository.ts
54
+ // │ ├── dto/
55
+ // │ │ ├── create-user.dto.ts
56
+ // │ │ └── update-user.dto.ts
57
+ // │ └── entities/
58
+ // │ └── user.entity.ts
59
+ ```
60
+
61
+ ### 2. Controller Pattern
62
+
63
+ ```typescript
64
+ // ✅ Controller
65
+ @Controller('users')
66
+ @ApiTags('users')
67
+ export class UserController {
68
+ constructor(private readonly userService: UserService) {}
69
+
70
+ @Get()
71
+ @ApiOperation({ summary: 'Get all users' })
72
+ @ApiResponse({ status: 200, type: [UserResponseDto] })
73
+ async findAll(@Query() query: FindUsersQueryDto): Promise<UserResponseDto[]> {
74
+ return this.userService.findAll(query);
75
+ }
76
+
77
+ @Get(':id')
78
+ @ApiOperation({ summary: 'Get user by ID' })
79
+ @ApiResponse({ status: 200, type: UserResponseDto })
80
+ @ApiResponse({ status: 404, description: 'User not found' })
81
+ async findOne(@Param('id', ParseUUIDPipe) id: string): Promise<UserResponseDto> {
82
+ return this.userService.findOne(id);
83
+ }
84
+
85
+ @Post()
86
+ @ApiOperation({ summary: 'Create user' })
87
+ @ApiResponse({ status: 201, type: UserResponseDto })
88
+ async create(@Body() createUserDto: CreateUserDto): Promise<UserResponseDto> {
89
+ return this.userService.create(createUserDto);
90
+ }
91
+
92
+ @Patch(':id')
93
+ async update(
94
+ @Param('id', ParseUUIDPipe) id: string,
95
+ @Body() updateUserDto: UpdateUserDto,
96
+ ): Promise<UserResponseDto> {
97
+ return this.userService.update(id, updateUserDto);
98
+ }
99
+
100
+ @Delete(':id')
101
+ @HttpCode(HttpStatus.NO_CONTENT)
102
+ async remove(@Param('id', ParseUUIDPipe) id: string): Promise<void> {
103
+ await this.userService.remove(id);
104
+ }
105
+ }
106
+ ```
107
+
108
+ ### 3. Service Pattern
109
+
110
+ ```typescript
111
+ // ✅ Service
112
+ @Injectable()
113
+ export class UserService {
114
+ constructor(
115
+ private readonly userRepository: UserRepository,
116
+ private readonly eventEmitter: EventEmitter2,
117
+ ) {}
118
+
119
+ async findAll(query: FindUsersQueryDto): Promise<User[]> {
120
+ return this.userRepository.findWithPagination(query);
121
+ }
122
+
123
+ async findOne(id: string): Promise<User> {
124
+ const user = await this.userRepository.findById(id);
125
+ if (!user) {
126
+ throw new NotFoundException(`User with ID ${id} not found`);
127
+ }
128
+ return user;
129
+ }
130
+
131
+ async create(dto: CreateUserDto): Promise<User> {
132
+ const existingUser = await this.userRepository.findByEmail(dto.email);
133
+ if (existingUser) {
134
+ throw new ConflictException('Email already exists');
135
+ }
136
+
137
+ const user = await this.userRepository.create(dto);
138
+ this.eventEmitter.emit('user.created', new UserCreatedEvent(user));
139
+ return user;
140
+ }
141
+
142
+ async update(id: string, dto: UpdateUserDto): Promise<User> {
143
+ const user = await this.findOne(id);
144
+ return this.userRepository.update(user.id, dto);
145
+ }
146
+
147
+ async remove(id: string): Promise<void> {
148
+ const user = await this.findOne(id);
149
+ await this.userRepository.softDelete(user.id);
150
+ this.eventEmitter.emit('user.deleted', new UserDeletedEvent(user));
151
+ }
152
+ }
153
+ ```
154
+
155
+ ### 4. DTO + Validation
156
+
157
+ ```typescript
158
+ // ✅ Request DTO
159
+ export class CreateUserDto {
160
+ @ApiProperty({ example: 'john@example.com' })
161
+ @IsEmail()
162
+ @IsNotEmpty()
163
+ email: string;
164
+
165
+ @ApiProperty({ example: 'John Doe' })
166
+ @IsString()
167
+ @MinLength(2)
168
+ @MaxLength(100)
169
+ name: string;
170
+
171
+ @ApiProperty({ example: 'password123' })
172
+ @IsString()
173
+ @MinLength(8)
174
+ @Matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)/, {
175
+ message: 'Password must contain uppercase, lowercase, and number',
176
+ })
177
+ password: string;
178
+ }
179
+
180
+ // ✅ Response DTO (only Expose fields are visible)
181
+ @Exclude()
182
+ export class UserResponseDto {
183
+ @Expose()
184
+ @ApiProperty()
185
+ id: string;
186
+
187
+ @Expose()
188
+ @ApiProperty()
189
+ email: string;
190
+
191
+ @Expose()
192
+ @ApiProperty()
193
+ name: string;
194
+
195
+ @Expose()
196
+ @ApiProperty()
197
+ createdAt: Date;
198
+
199
+ // password is excluded
200
+ }
201
+
202
+ // ✅ Query DTO
203
+ export class FindUsersQueryDto {
204
+ @ApiPropertyOptional()
205
+ @IsOptional()
206
+ @IsString()
207
+ search?: string;
208
+
209
+ @ApiPropertyOptional({ default: 1 })
210
+ @IsOptional()
211
+ @Type(() => Number)
212
+ @IsInt()
213
+ @Min(1)
214
+ page?: number = 1;
215
+
216
+ @ApiPropertyOptional({ default: 10 })
217
+ @IsOptional()
218
+ @Type(() => Number)
219
+ @IsInt()
220
+ @Min(1)
221
+ @Max(100)
222
+ limit?: number = 10;
223
+ }
224
+ ```
225
+
226
+ ### 5. Exception Handling
227
+
228
+ ```typescript
229
+ // ✅ Custom Exception Filter
230
+ @Catch()
231
+ export class AllExceptionsFilter implements ExceptionFilter {
232
+ constructor(private readonly logger: Logger) {}
233
+
234
+ catch(exception: unknown, host: ArgumentsHost): void {
235
+ const ctx = host.switchToHttp();
236
+ const response = ctx.getResponse<Response>();
237
+ const request = ctx.getRequest<Request>();
238
+
239
+ const { status, message } = this.getErrorDetails(exception);
240
+
241
+ const errorResponse = {
242
+ statusCode: status,
243
+ timestamp: new Date().toISOString(),
244
+ path: request.url,
245
+ message,
246
+ };
247
+
248
+ this.logger.error(
249
+ `${request.method} ${request.url} - ${status}`,
250
+ exception instanceof Error ? exception.stack : undefined,
251
+ );
252
+
253
+ response.status(status).json(errorResponse);
254
+ }
255
+
256
+ private getErrorDetails(exception: unknown): { status: number; message: string } {
257
+ if (exception instanceof HttpException) {
258
+ return {
259
+ status: exception.getStatus(),
260
+ message: exception.message,
261
+ };
262
+ }
263
+
264
+ return {
265
+ status: HttpStatus.INTERNAL_SERVER_ERROR,
266
+ message: 'Internal server error',
267
+ };
268
+ }
269
+ }
270
+
271
+ // ✅ Business Exception
272
+ export class UserNotFoundException extends NotFoundException {
273
+ constructor(userId: string) {
274
+ super(`User with ID ${userId} not found`);
275
+ }
276
+ }
277
+ ```
278
+
279
+ ### 6. Guard & Interceptor
280
+
281
+ ```typescript
282
+ // ✅ Auth Guard
283
+ @Injectable()
284
+ export class JwtAuthGuard extends AuthGuard('jwt') {
285
+ canActivate(context: ExecutionContext) {
286
+ return super.canActivate(context);
287
+ }
288
+
289
+ handleRequest<T>(err: Error, user: T): T {
290
+ if (err || !user) {
291
+ throw err || new UnauthorizedException();
292
+ }
293
+ return user;
294
+ }
295
+ }
296
+
297
+ // ✅ Role Guard
298
+ @Injectable()
299
+ export class RolesGuard implements CanActivate {
300
+ constructor(private reflector: Reflector) {}
301
+
302
+ canActivate(context: ExecutionContext): boolean {
303
+ const requiredRoles = this.reflector.getAllAndOverride<Role[]>(
304
+ ROLES_KEY,
305
+ [context.getHandler(), context.getClass()],
306
+ );
307
+ if (!requiredRoles) {
308
+ return true;
309
+ }
310
+ const { user } = context.switchToHttp().getRequest();
311
+ return requiredRoles.some((role) => user.roles?.includes(role));
312
+ }
313
+ }
314
+
315
+ // ✅ Transform Interceptor
316
+ @Injectable()
317
+ export class TransformInterceptor<T> implements NestInterceptor<T, Response<T>> {
318
+ intercept(context: ExecutionContext, next: CallHandler): Observable<Response<T>> {
319
+ return next.handle().pipe(
320
+ map((data) => ({
321
+ success: true,
322
+ data,
323
+ timestamp: new Date().toISOString(),
324
+ })),
325
+ );
326
+ }
327
+ }
328
+ ```
329
+
330
+ ### 7. Repository Pattern (TypeORM)
331
+
332
+ ```typescript
333
+ // ✅ Custom Repository
334
+ @Injectable()
335
+ export class UserRepository {
336
+ constructor(
337
+ @InjectRepository(User)
338
+ private readonly repo: Repository<User>,
339
+ ) {}
340
+
341
+ async findById(id: string): Promise<User | null> {
342
+ return this.repo.findOne({ where: { id } });
343
+ }
344
+
345
+ async findByEmail(email: string): Promise<User | null> {
346
+ return this.repo.findOne({ where: { email } });
347
+ }
348
+
349
+ async findWithPagination(query: FindUsersQueryDto): Promise<User[]> {
350
+ const { search, page, limit } = query;
351
+ const qb = this.repo.createQueryBuilder('user');
352
+
353
+ if (search) {
354
+ qb.where('user.name ILIKE :search OR user.email ILIKE :search', {
355
+ search: `%${search}%`,
356
+ });
357
+ }
358
+
359
+ return qb
360
+ .skip((page - 1) * limit)
361
+ .take(limit)
362
+ .orderBy('user.createdAt', 'DESC')
363
+ .getMany();
364
+ }
365
+
366
+ async create(dto: CreateUserDto): Promise<User> {
367
+ const user = this.repo.create(dto);
368
+ return this.repo.save(user);
369
+ }
370
+
371
+ async update(id: string, dto: UpdateUserDto): Promise<User> {
372
+ await this.repo.update(id, dto);
373
+ return this.findById(id);
374
+ }
375
+
376
+ async softDelete(id: string): Promise<void> {
377
+ await this.repo.softDelete(id);
378
+ }
379
+ }
380
+ ```
381
+
382
+ ### 8. Configuration
383
+
384
+ ```typescript
385
+ // ✅ Config Module
386
+ @Module({
387
+ imports: [
388
+ ConfigModule.forRoot({
389
+ isGlobal: true,
390
+ validationSchema: Joi.object({
391
+ NODE_ENV: Joi.string().valid('development', 'production', 'test').required(),
392
+ PORT: Joi.number().default(3000),
393
+ DATABASE_URL: Joi.string().required(),
394
+ JWT_SECRET: Joi.string().required(),
395
+ JWT_EXPIRES_IN: Joi.string().default('1d'),
396
+ }),
397
+ }),
398
+ ],
399
+ })
400
+ export class AppConfigModule {}
401
+
402
+ // ✅ Typed Config Service
403
+ @Injectable()
404
+ export class AppConfigService {
405
+ constructor(private configService: ConfigService) {}
406
+
407
+ get port(): number {
408
+ return this.configService.get<number>('PORT', 3000);
409
+ }
410
+
411
+ get databaseUrl(): string {
412
+ return this.configService.getOrThrow<string>('DATABASE_URL');
413
+ }
414
+
415
+ get jwtSecret(): string {
416
+ return this.configService.getOrThrow<string>('JWT_SECRET');
417
+ }
418
+
419
+ get isProduction(): boolean {
420
+ return this.configService.get('NODE_ENV') === 'production';
421
+ }
422
+ }
423
+ ```
424
+
425
+ ## Recommended Folder Structure
426
+
427
+ ```
428
+ src/
429
+ ├── main.ts
430
+ ├── app.module.ts
431
+ ├── common/ # Shared module
432
+ │ ├── decorators/
433
+ │ ├── filters/
434
+ │ ├── guards/
435
+ │ ├── interceptors/
436
+ │ ├── pipes/
437
+ │ └── common.module.ts
438
+ ├── config/ # Configuration
439
+ │ ├── app.config.ts
440
+ │ └── database.config.ts
441
+ ├── user/ # Feature module
442
+ │ ├── dto/
443
+ │ ├── entities/
444
+ │ ├── user.controller.ts
445
+ │ ├── user.service.ts
446
+ │ ├── user.repository.ts
447
+ │ └── user.module.ts
448
+ └── auth/
449
+ ├── strategies/
450
+ ├── guards/
451
+ └── auth.module.ts
452
+ ```
453
+
454
+ ## Testing
455
+
456
+ ```typescript
457
+ // ✅ Unit Test
458
+ describe('UserService', () => {
459
+ let service: UserService;
460
+ let repository: MockType<UserRepository>;
461
+
462
+ beforeEach(async () => {
463
+ const module = await Test.createTestingModule({
464
+ providers: [
465
+ UserService,
466
+ {
467
+ provide: UserRepository,
468
+ useFactory: () => ({
469
+ findById: jest.fn(),
470
+ create: jest.fn(),
471
+ }),
472
+ },
473
+ ],
474
+ }).compile();
475
+
476
+ service = module.get(UserService);
477
+ repository = module.get(UserRepository);
478
+ });
479
+
480
+ it('should create a user', async () => {
481
+ const dto = { email: 'test@test.com', name: 'Test' };
482
+ repository.create.mockResolvedValue({ id: '1', ...dto });
483
+
484
+ const result = await service.create(dto);
485
+ expect(result.email).toBe(dto.email);
486
+ });
487
+ });
488
+
489
+ // ✅ E2E Test
490
+ describe('UserController (e2e)', () => {
491
+ let app: INestApplication;
492
+
493
+ beforeAll(async () => {
494
+ const module = await Test.createTestingModule({
495
+ imports: [AppModule],
496
+ }).compile();
497
+
498
+ app = module.createNestApplication();
499
+ await app.init();
500
+ });
501
+
502
+ it('/users (GET)', () => {
503
+ return request(app.getHttpServer())
504
+ .get('/users')
505
+ .expect(200)
506
+ .expect((res) => {
507
+ expect(Array.isArray(res.body)).toBe(true);
508
+ });
509
+ });
510
+ });
511
+ ```
512
+
513
+ ## Checklist
514
+
515
+ - [ ] Separate request/response types with DTOs
516
+ - [ ] Validate with class-validator
517
+ - [ ] Serialize with class-transformer
518
+ - [ ] Use custom Exceptions
519
+ - [ ] Apply Repository pattern
520
+ - [ ] Handle auth/authorization with Guards
521
+ - [ ] Transform responses with Interceptors
522
+ - [ ] Validate environment variables with ConfigModule
523
+ - [ ] Document API with Swagger
524
+ - [ ] Write Unit + E2E tests