dsh-ecc-skills 0.4.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 (278) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +99 -0
  3. package/cordis.patch.yml +5 -0
  4. package/lib/index.js +195 -0
  5. package/package.json +46 -0
  6. package/skills/accessibility/SKILL.md +147 -0
  7. package/skills/agent-architecture-audit/SKILL.md +257 -0
  8. package/skills/agent-eval/SKILL.md +147 -0
  9. package/skills/agent-harness-construction/SKILL.md +74 -0
  10. package/skills/agent-introspection-debugging/SKILL.md +154 -0
  11. package/skills/agent-payment-x402/SKILL.md +225 -0
  12. package/skills/agent-self-evaluation/SKILL.md +182 -0
  13. package/skills/agent-sort/SKILL.md +216 -0
  14. package/skills/agentic-engineering/SKILL.md +64 -0
  15. package/skills/agentic-os/SKILL.md +388 -0
  16. package/skills/ai-first-engineering/SKILL.md +52 -0
  17. package/skills/ai-regression-testing/SKILL.md +386 -0
  18. package/skills/android-clean-architecture/SKILL.md +340 -0
  19. package/skills/angular-developer/SKILL.md +155 -0
  20. package/skills/api-connector-builder/SKILL.md +121 -0
  21. package/skills/api-design/SKILL.md +524 -0
  22. package/skills/architecture-decision-records/SKILL.md +180 -0
  23. package/skills/article-writing/SKILL.md +80 -0
  24. package/skills/automation-audit-ops/SKILL.md +143 -0
  25. package/skills/autonomous-agent-harness/SKILL.md +274 -0
  26. package/skills/autonomous-loops/SKILL.md +611 -0
  27. package/skills/backend-patterns/SKILL.md +562 -0
  28. package/skills/benchmark/SKILL.md +95 -0
  29. package/skills/benchmark-methodology/SKILL.md +191 -0
  30. package/skills/benchmark-optimization-loop/SKILL.md +71 -0
  31. package/skills/blender-motion-state-inspection/SKILL.md +165 -0
  32. package/skills/blueprint/SKILL.md +106 -0
  33. package/skills/brand-discovery/SKILL.md +145 -0
  34. package/skills/brand-voice/SKILL.md +98 -0
  35. package/skills/browser-qa/SKILL.md +105 -0
  36. package/skills/bun-runtime/SKILL.md +85 -0
  37. package/skills/canary-watch/SKILL.md +108 -0
  38. package/skills/carrier-relationship-management/SKILL.md +212 -0
  39. package/skills/cisco-ios-patterns/SKILL.md +164 -0
  40. package/skills/ck/SKILL.md +148 -0
  41. package/skills/claude-devfleet/SKILL.md +112 -0
  42. package/skills/click-path-audit/SKILL.md +245 -0
  43. package/skills/clickhouse-io/SKILL.md +445 -0
  44. package/skills/code-tour/SKILL.md +254 -0
  45. package/skills/codebase-onboarding/SKILL.md +234 -0
  46. package/skills/codehealth-mcp/SKILL.md +167 -0
  47. package/skills/coding-standards/SKILL.md +551 -0
  48. package/skills/competitive-platform-analysis/SKILL.md +214 -0
  49. package/skills/competitive-report-structure/SKILL.md +162 -0
  50. package/skills/compose-multiplatform-patterns/SKILL.md +300 -0
  51. package/skills/config-gc/SKILL.md +120 -0
  52. package/skills/configure-ecc/SKILL.md +206 -0
  53. package/skills/connections-optimizer/SKILL.md +190 -0
  54. package/skills/content-engine/SKILL.md +132 -0
  55. package/skills/content-hash-cache-pattern/SKILL.md +162 -0
  56. package/skills/context-budget/SKILL.md +136 -0
  57. package/skills/continuous-agent-loop/SKILL.md +46 -0
  58. package/skills/contract-first/SKILL.md +287 -0
  59. package/skills/cost-aware-llm-pipeline/SKILL.md +184 -0
  60. package/skills/cost-tracking/SKILL.md +97 -0
  61. package/skills/council/SKILL.md +204 -0
  62. package/skills/council-multi-model/SKILL.md +167 -0
  63. package/skills/cpp-coding-standards/SKILL.md +724 -0
  64. package/skills/cpp-testing/SKILL.md +325 -0
  65. package/skills/crosspost/SKILL.md +112 -0
  66. package/skills/csharp-testing/SKILL.md +322 -0
  67. package/skills/customer-billing-ops/SKILL.md +141 -0
  68. package/skills/customs-trade-compliance/SKILL.md +263 -0
  69. package/skills/dart-flutter-patterns/SKILL.md +564 -0
  70. package/skills/dashboard-builder/SKILL.md +109 -0
  71. package/skills/data-scraper-agent/SKILL.md +765 -0
  72. package/skills/data-throughput-accelerator/SKILL.md +74 -0
  73. package/skills/database-migrations/SKILL.md +430 -0
  74. package/skills/deep-research/SKILL.md +160 -0
  75. package/skills/defi-amm-security/SKILL.md +167 -0
  76. package/skills/delivery-gate/SKILL.md +126 -0
  77. package/skills/deployment-patterns/SKILL.md +428 -0
  78. package/skills/design-system/SKILL.md +83 -0
  79. package/skills/dev-team/SKILL.md +203 -0
  80. package/skills/django-celery/SKILL.md +458 -0
  81. package/skills/django-patterns/SKILL.md +735 -0
  82. package/skills/django-security/SKILL.md +644 -0
  83. package/skills/django-tdd/SKILL.md +730 -0
  84. package/skills/django-verification/SKILL.md +470 -0
  85. package/skills/dmux-workflows/SKILL.md +192 -0
  86. package/skills/docker-patterns/SKILL.md +520 -0
  87. package/skills/documentation-lookup/SKILL.md +91 -0
  88. package/skills/dotnet-patterns/SKILL.md +322 -0
  89. package/skills/dynamic-workflow-mode/SKILL.md +124 -0
  90. package/skills/e2e-testing/SKILL.md +327 -0
  91. package/skills/ecc-tools-cost-audit/SKILL.md +161 -0
  92. package/skills/email-ops/SKILL.md +122 -0
  93. package/skills/energy-procurement/SKILL.md +228 -0
  94. package/skills/enterprise-agent-ops/SKILL.md +51 -0
  95. package/skills/error-handling/SKILL.md +377 -0
  96. package/skills/eval-harness/SKILL.md +271 -0
  97. package/skills/evm-token-decimals/SKILL.md +131 -0
  98. package/skills/exa-search/SKILL.md +108 -0
  99. package/skills/fal-ai-media/SKILL.md +289 -0
  100. package/skills/fastapi-patterns/SKILL.md +514 -0
  101. package/skills/finance-billing-ops/SKILL.md +128 -0
  102. package/skills/flox-environments/SKILL.md +497 -0
  103. package/skills/flutter-dart-code-review/SKILL.md +436 -0
  104. package/skills/foundation-models-on-device/SKILL.md +243 -0
  105. package/skills/frontend-a11y/SKILL.md +446 -0
  106. package/skills/frontend-design-direction/SKILL.md +93 -0
  107. package/skills/frontend-patterns/SKILL.md +657 -0
  108. package/skills/fsharp-testing/SKILL.md +281 -0
  109. package/skills/gan-style-harness/SKILL.md +279 -0
  110. package/skills/generating-python-installer/SKILL.md +820 -0
  111. package/skills/git-workflow/SKILL.md +716 -0
  112. package/skills/github-ops/SKILL.md +145 -0
  113. package/skills/golang-patterns/SKILL.md +676 -0
  114. package/skills/golang-testing/SKILL.md +721 -0
  115. package/skills/google-workspace-ops/SKILL.md +96 -0
  116. package/skills/growth-log/SKILL.md +128 -0
  117. package/skills/healthcare-cdss-patterns/SKILL.md +246 -0
  118. package/skills/healthcare-emr-patterns/SKILL.md +160 -0
  119. package/skills/healthcare-eval-harness/SKILL.md +208 -0
  120. package/skills/healthcare-phi-compliance/SKILL.md +146 -0
  121. package/skills/hermes-imports/SKILL.md +89 -0
  122. package/skills/hexagonal-architecture/SKILL.md +277 -0
  123. package/skills/hipaa-compliance/SKILL.md +79 -0
  124. package/skills/homelab-network-readiness/SKILL.md +170 -0
  125. package/skills/homelab-network-setup/SKILL.md +130 -0
  126. package/skills/homelab-pihole-dns/SKILL.md +275 -0
  127. package/skills/homelab-vlan-segmentation/SKILL.md +312 -0
  128. package/skills/homelab-wireguard-vpn/SKILL.md +306 -0
  129. package/skills/hookify-rules/SKILL.md +128 -0
  130. package/skills/inherit-legacy-style/SKILL.md +157 -0
  131. package/skills/intent-driven-development/SKILL.md +360 -0
  132. package/skills/inventory-demand-planning/SKILL.md +247 -0
  133. package/skills/investor-materials/SKILL.md +97 -0
  134. package/skills/investor-outreach/SKILL.md +92 -0
  135. package/skills/ios-icon-gen/SKILL.md +158 -0
  136. package/skills/iterative-retrieval/SKILL.md +212 -0
  137. package/skills/ito-baskets/SKILL.md +263 -0
  138. package/skills/ito-compute/SKILL.md +151 -0
  139. package/skills/ito-inference/SKILL.md +119 -0
  140. package/skills/ito-training/SKILL.md +123 -0
  141. package/skills/java-coding-standards/SKILL.md +384 -0
  142. package/skills/jira-integration/SKILL.md +303 -0
  143. package/skills/jpa-patterns/SKILL.md +152 -0
  144. package/skills/knowledge-ops/SKILL.md +155 -0
  145. package/skills/kotlin-coroutines-flows/SKILL.md +285 -0
  146. package/skills/kotlin-exposed-patterns/SKILL.md +720 -0
  147. package/skills/kotlin-ktor-patterns/SKILL.md +690 -0
  148. package/skills/kotlin-patterns/SKILL.md +712 -0
  149. package/skills/kotlin-testing/SKILL.md +825 -0
  150. package/skills/kubernetes-patterns/SKILL.md +756 -0
  151. package/skills/laravel-patterns/SKILL.md +416 -0
  152. package/skills/laravel-plugin-discovery/SKILL.md +230 -0
  153. package/skills/laravel-security/SKILL.md +948 -0
  154. package/skills/laravel-tdd/SKILL.md +675 -0
  155. package/skills/laravel-verification/SKILL.md +180 -0
  156. package/skills/latency-critical-systems/SKILL.md +75 -0
  157. package/skills/lead-intelligence/SKILL.md +322 -0
  158. package/skills/liquid-glass-design/SKILL.md +279 -0
  159. package/skills/living-docs-governance/SKILL.md +137 -0
  160. package/skills/llm-trading-agent-security/SKILL.md +147 -0
  161. package/skills/logistics-exception-management/SKILL.md +222 -0
  162. package/skills/loop-design-check/SKILL.md +143 -0
  163. package/skills/mailtrap-email-integration/SKILL.md +77 -0
  164. package/skills/make-interfaces-feel-better/SKILL.md +152 -0
  165. package/skills/manim-video/SKILL.md +90 -0
  166. package/skills/market-research/SKILL.md +76 -0
  167. package/skills/marketing-campaign/SKILL.md +114 -0
  168. package/skills/mcp-server-patterns/SKILL.md +70 -0
  169. package/skills/messages-ops/SKILL.md +105 -0
  170. package/skills/ml-adoption-playbook/SKILL.md +57 -0
  171. package/skills/mle-workflow/SKILL.md +348 -0
  172. package/skills/motion-advanced/SKILL.md +597 -0
  173. package/skills/motion-foundations/SKILL.md +300 -0
  174. package/skills/motion-patterns/SKILL.md +435 -0
  175. package/skills/motion-ui/SKILL.md +576 -0
  176. package/skills/mysql-patterns/SKILL.md +413 -0
  177. package/skills/nanoclaw-repl/SKILL.md +34 -0
  178. package/skills/nasiko-control-plane/SKILL.md +49 -0
  179. package/skills/nestjs-patterns/SKILL.md +231 -0
  180. package/skills/netmiko-ssh-automation/SKILL.md +174 -0
  181. package/skills/network-bgp-diagnostics/SKILL.md +168 -0
  182. package/skills/network-config-validation/SKILL.md +211 -0
  183. package/skills/network-interface-health/SKILL.md +153 -0
  184. package/skills/nextjs-turbopack/SKILL.md +58 -0
  185. package/skills/nodejs-keccak256/SKILL.md +103 -0
  186. package/skills/nutrient-document-processing/SKILL.md +168 -0
  187. package/skills/nuxt4-patterns/SKILL.md +101 -0
  188. package/skills/opensource-pipeline/SKILL.md +256 -0
  189. package/skills/orch-add-feature/SKILL.md +45 -0
  190. package/skills/orch-build-mvp/SKILL.md +49 -0
  191. package/skills/orch-change-feature/SKILL.md +43 -0
  192. package/skills/orch-fix-defect/SKILL.md +43 -0
  193. package/skills/orch-pipeline/SKILL.md +121 -0
  194. package/skills/orch-refine-code/SKILL.md +44 -0
  195. package/skills/parallel-execution-optimizer/SKILL.md +74 -0
  196. package/skills/perl-patterns/SKILL.md +505 -0
  197. package/skills/perl-security/SKILL.md +504 -0
  198. package/skills/perl-testing/SKILL.md +476 -0
  199. package/skills/plan-canvas/SKILL.md +196 -0
  200. package/skills/plankton-code-quality/SKILL.md +237 -0
  201. package/skills/postgres-patterns/SKILL.md +148 -0
  202. package/skills/prediction-market-oracle-research/SKILL.md +64 -0
  203. package/skills/prediction-market-risk-review/SKILL.md +61 -0
  204. package/skills/prisma-patterns/SKILL.md +401 -0
  205. package/skills/product-capability/SKILL.md +142 -0
  206. package/skills/product-lens/SKILL.md +93 -0
  207. package/skills/production-audit/SKILL.md +207 -0
  208. package/skills/production-scheduling/SKILL.md +238 -0
  209. package/skills/project-flow-ops/SKILL.md +112 -0
  210. package/skills/prompt-optimizer/SKILL.md +398 -0
  211. package/skills/python-patterns/SKILL.md +751 -0
  212. package/skills/python-testing/SKILL.md +817 -0
  213. package/skills/pytorch-patterns/SKILL.md +397 -0
  214. package/skills/quality-nonconformance/SKILL.md +260 -0
  215. package/skills/quarkus-patterns/SKILL.md +723 -0
  216. package/skills/quarkus-security/SKILL.md +468 -0
  217. package/skills/quarkus-tdd/SKILL.md +812 -0
  218. package/skills/quarkus-verification/SKILL.md +481 -0
  219. package/skills/ralphinho-rfc-pipeline/SKILL.md +68 -0
  220. package/skills/react-native-patterns/SKILL.md +326 -0
  221. package/skills/react-patterns/SKILL.md +342 -0
  222. package/skills/react-performance/SKILL.md +575 -0
  223. package/skills/react-testing/SKILL.md +424 -0
  224. package/skills/recsys-pipeline-architect/SKILL.md +115 -0
  225. package/skills/recursive-decision-ledger/SKILL.md +81 -0
  226. package/skills/redis-patterns/SKILL.md +404 -0
  227. package/skills/regex-vs-llm-structured-text/SKILL.md +221 -0
  228. package/skills/remotion-video-creation/SKILL.md +43 -0
  229. package/skills/repo-scan/SKILL.md +170 -0
  230. package/skills/research-ops/SKILL.md +113 -0
  231. package/skills/returns-reverse-logistics/SKILL.md +240 -0
  232. package/skills/rules-distill/SKILL.md +265 -0
  233. package/skills/rust-patterns/SKILL.md +500 -0
  234. package/skills/rust-testing/SKILL.md +501 -0
  235. package/skills/safety-guard/SKILL.md +76 -0
  236. package/skills/santa-method/SKILL.md +307 -0
  237. package/skills/scientific-db-pubmed-database/SKILL.md +176 -0
  238. package/skills/scientific-db-uspto-database/SKILL.md +178 -0
  239. package/skills/scientific-pkg-gget/SKILL.md +167 -0
  240. package/skills/scientific-thinking-literature-review/SKILL.md +193 -0
  241. package/skills/scientific-thinking-scholar-evaluation/SKILL.md +161 -0
  242. package/skills/search-first/SKILL.md +183 -0
  243. package/skills/security-bounty-hunter/SKILL.md +100 -0
  244. package/skills/security-scan/SKILL.md +166 -0
  245. package/skills/seo/SKILL.md +155 -0
  246. package/skills/skill-scout/SKILL.md +141 -0
  247. package/skills/skill-stocktake/SKILL.md +195 -0
  248. package/skills/social-graph-ranker/SKILL.md +155 -0
  249. package/skills/social-publisher/SKILL.md +130 -0
  250. package/skills/springboot-patterns/SKILL.md +315 -0
  251. package/skills/springboot-security/SKILL.md +273 -0
  252. package/skills/springboot-tdd/SKILL.md +159 -0
  253. package/skills/springboot-verification/SKILL.md +232 -0
  254. package/skills/swift-actor-persistence/SKILL.md +144 -0
  255. package/skills/swift-concurrency-6-2/SKILL.md +216 -0
  256. package/skills/swift-protocol-di-testing/SKILL.md +191 -0
  257. package/skills/swiftui-patterns/SKILL.md +259 -0
  258. package/skills/taste/SKILL.md +264 -0
  259. package/skills/tdd-workflow/SKILL.md +583 -0
  260. package/skills/team-agent-orchestration/SKILL.md +111 -0
  261. package/skills/team-builder/SKILL.md +169 -0
  262. package/skills/terminal-opener/SKILL.md +55 -0
  263. package/skills/terminal-ops/SKILL.md +110 -0
  264. package/skills/tinystruct-patterns/SKILL.md +279 -0
  265. package/skills/token-budget-advisor/SKILL.md +134 -0
  266. package/skills/ui-demo/SKILL.md +466 -0
  267. package/skills/ui-to-vue/SKILL.md +135 -0
  268. package/skills/uncloud/SKILL.md +344 -0
  269. package/skills/unified-memory/SKILL.md +170 -0
  270. package/skills/unified-notifications-ops/SKILL.md +188 -0
  271. package/skills/verification-loop/SKILL.md +129 -0
  272. package/skills/video-editing/SKILL.md +311 -0
  273. package/skills/videodb/SKILL.md +375 -0
  274. package/skills/vite-patterns/SKILL.md +450 -0
  275. package/skills/vue-patterns/SKILL.md +471 -0
  276. package/skills/windows-desktop-e2e/SKILL.md +888 -0
  277. package/skills/workspace-surface-audit/SKILL.md +126 -0
  278. package/skills/x-api/SKILL.md +235 -0
@@ -0,0 +1,401 @@
1
+ ---
2
+ name: prisma-patterns
3
+ description: Prisma ORM patterns for TypeScript backends — schema design, query optimization, transactions, pagination, and critical traps like updateMany returning count not records, $transaction timeouts, migrate dev resetting the DB, @updatedAt skipped on bulk writes, and serverless connection exhaustion. Use when writing a Prisma schema or query, or debugging transactions, migrations, or serverless connection limits.
4
+ metadata:
5
+ origin: ECC
6
+ ---
7
+
8
+ # Prisma Patterns
9
+
10
+ Production patterns and non-obvious traps for Prisma ORM in TypeScript backends.
11
+
12
+ > **Check your version before applying patterns.** The Prisma API surface has evolved across major releases:
13
+ >
14
+ > ```bash
15
+ > npx prisma --version
16
+ > ```
17
+ >
18
+ > Notable API differences across versions:
19
+ > - `relationJoins` can load relations via JOIN rather than separate queries, but may cause row explosion on large 1:N relations or deep `include` — benchmark both approaches
20
+ > - `omit` field modifier and `prisma.$extends` Client Extensions API were added
21
+ > - **Newer installs**: the package may be named `prisma` instead of `@prisma/client`; `PrismaClient` may require a driver adapter (e.g. `@prisma/adapter-pg`); `datasource.url` may live in `prisma.config.ts` instead of `schema.prisma`
22
+ > - CLI commands (`migrate dev`, `migrate deploy`, `generate`) are unchanged across versions
23
+
24
+ ## When to Activate
25
+
26
+ - Designing or modifying Prisma schema models and relations
27
+ - Writing queries, transactions, or pagination logic
28
+ - Using `updateMany`, `deleteMany`, or any bulk operation
29
+ - Running or planning database migrations
30
+ - Deploying to serverless environments (Vercel, Lambda, Cloudflare Workers)
31
+ - Implementing soft delete or multi-tenant row filtering
32
+
33
+ ## Core Concepts
34
+
35
+ ### ID Strategy
36
+
37
+ | Strategy | Use When | Avoid When |
38
+ |---|---|---|
39
+ | `@default(cuid())` | Default choice — URL-safe, sortable, no collisions | Sequential IDs needed for external systems |
40
+ | `@default(uuid())` | Interoperability with non-Prisma systems required | High-write tables (random UUIDs fragment B-tree indexes) |
41
+ | `@default(autoincrement())` | Internal join tables, audit logs | Public-facing IDs (exposes record count) |
42
+
43
+ ### Schema Defaults
44
+
45
+ ```prisma
46
+ model User {
47
+ id String @id @default(cuid())
48
+ email String @unique // @unique already creates an index — no @@index needed
49
+ name String
50
+ role Role @default(USER)
51
+ posts Post[]
52
+ createdAt DateTime @default(now())
53
+ updatedAt DateTime @updatedAt
54
+ deletedAt DateTime?
55
+
56
+ @@index([createdAt])
57
+ @@index([deletedAt, createdAt]) // composite for soft-delete + sort queries
58
+ }
59
+ ```
60
+
61
+ - Add `@@index` on every foreign key and column used in `WHERE` or `ORDER BY`.
62
+ - Declare `deletedAt DateTime?` upfront when soft delete is a foreseeable requirement — adding it later requires a migration on a live table.
63
+ - `updatedAt @updatedAt` is set automatically by Prisma on `update` and `upsert` only (see Anti-Patterns for bulk update trap).
64
+
65
+ ### `include` vs `select`
66
+
67
+ | | `include` | `select` |
68
+ |---|---|---|
69
+ | Returns | All scalar fields + specified relations | Only specified fields |
70
+ | Use when | You need most fields plus a relation | Hot paths, large tables, avoiding over-fetch |
71
+ | Performance | May over-fetch on wide tables | Minimal payload, faster on large datasets |
72
+ | Prisma 5 note | Uses JOIN by default (`relationJoins`) | Same |
73
+
74
+ ```ts
75
+ // include — all columns + relation
76
+ const user = await prisma.user.findUnique({
77
+ where: { id },
78
+ include: { posts: { select: { id: true, title: true } } },
79
+ });
80
+
81
+ // select — explicit allowlist
82
+ const user = await prisma.user.findUnique({
83
+ where: { id },
84
+ select: { id: true, email: true, name: true },
85
+ });
86
+ ```
87
+
88
+ Never return raw Prisma entities from API responses — map to response DTOs to control exposed fields:
89
+
90
+ ```ts
91
+ // BAD: leaks passwordHash, deletedAt, internal fields
92
+ return await prisma.user.findUniqueOrThrow({ where: { id } });
93
+
94
+ // GOOD: explicit DTO mapping
95
+ const user = await prisma.user.findUniqueOrThrow({ where: { id } });
96
+ return { id: user.id, name: user.name, email: user.email };
97
+ ```
98
+
99
+ ### Transaction Form Selection
100
+
101
+ | Situation | Use |
102
+ |---|---|
103
+ | Independent operations, no inter-dependency | Array form |
104
+ | Later step depends on earlier result | Interactive form |
105
+ | External calls (email, HTTP) involved | Outside transaction entirely |
106
+
107
+ ```ts
108
+ // Array form — batched in one round trip
109
+ const [user, post] = await prisma.$transaction([
110
+ prisma.user.update({ where: { id }, data: { name } }),
111
+ prisma.post.create({ data: { title, authorId: id } }),
112
+ ]);
113
+
114
+ // Interactive form — use tx client only, never the outer prisma client
115
+ const post = await prisma.$transaction(async (tx) => {
116
+ const user = await tx.user.findUniqueOrThrow({ where: { id } });
117
+ if (user.role !== 'ADMIN') throw new Error('Forbidden');
118
+ return tx.post.create({ data: { title, authorId: user.id } });
119
+ });
120
+ ```
121
+
122
+ ### PrismaClient Singleton
123
+
124
+ Each `PrismaClient` instance opens its own connection pool. Instantiate once.
125
+
126
+ ```ts
127
+ // lib/prisma.ts
128
+
129
+ // Option A — adapter-based initialization (required by newer Prisma installs)
130
+ import { PrismaClient } from '@prisma/client'; // or the generated client path for your setup
131
+ import { PrismaPg } from '@prisma/adapter-pg';
132
+
133
+ function createPrismaClient() {
134
+ const adapter = new PrismaPg({
135
+ connectionString: process.env.DATABASE_URL!,
136
+ });
137
+ return new PrismaClient({
138
+ adapter,
139
+ log: process.env.NODE_ENV === 'development' ? ['query', 'error'] : ['error'],
140
+ });
141
+ }
142
+
143
+ const globalForPrisma = globalThis as unknown as { prisma?: PrismaClient };
144
+
145
+ export const prisma = globalForPrisma.prisma ?? createPrismaClient();
146
+
147
+ if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma;
148
+
149
+ // Option B — direct initialization (older installs, no adapter needed)
150
+ // import { PrismaClient } from '@prisma/client';
151
+ // export const prisma = globalForPrisma.prisma ?? new PrismaClient({ ... });
152
+ ```
153
+
154
+ Use Option A if your Prisma install requires an `adapter` argument in the `PrismaClient` constructor.
155
+ Use Option B if `new PrismaClient()` works without arguments. Let the compiler tell you which is correct.
156
+
157
+ The `globalThis` pattern prevents duplicate instances during hot reload (Next.js, nodemon, ts-node-dev).
158
+
159
+ ### N+1 Problem
160
+
161
+ Loading relations inside a loop issues one query per row.
162
+
163
+ ```ts
164
+ // BAD: N+1 — one extra query per user
165
+ const users = await prisma.user.findMany();
166
+ for (const user of users) {
167
+ const posts = await prisma.post.findMany({ where: { authorId: user.id } });
168
+ }
169
+
170
+ // GOOD: single query
171
+ const users = await prisma.user.findMany({ include: { posts: true } });
172
+ ```
173
+
174
+ With Prisma 5+ `relationJoins`, the `include` form uses a single JOIN. On large 1:N sets this may increase result set size — benchmark both approaches if the relation can return many rows per parent.
175
+
176
+ ## Code Examples
177
+
178
+ ### Cursor Pagination (preferred for feeds and large datasets)
179
+
180
+ ```ts
181
+ async function getPosts(cursor?: string, limit = 20) {
182
+ const items = await prisma.post.findMany({
183
+ where: { published: true },
184
+ orderBy: [
185
+ { createdAt: 'desc' },
186
+ { id: 'desc' }, // secondary sort prevents unstable pagination on duplicate timestamps
187
+ ],
188
+ take: limit + 1,
189
+ ...(cursor && { cursor: { id: cursor }, skip: 1 }),
190
+ });
191
+
192
+ const hasNextPage = items.length > limit;
193
+ if (hasNextPage) items.pop();
194
+
195
+ return { items, nextCursor: hasNextPage ? items[items.length - 1].id : null };
196
+ }
197
+ ```
198
+
199
+ Fetch `limit + 1` and pop — canonical way to detect `hasNextPage` without an extra count query. Always include a unique field (e.g. `id`) as a secondary `orderBy` to prevent unstable pagination when multiple rows share the same timestamp. Use offset pagination only when users need to jump to arbitrary pages (admin tables).
200
+
201
+ ### Soft Delete
202
+
203
+ ```ts
204
+ // Always filter explicitly — do not rely on middleware (hides behavior, hard to debug)
205
+ const activeUsers = await prisma.user.findMany({ where: { deletedAt: null } });
206
+
207
+ await prisma.user.update({ where: { id }, data: { deletedAt: new Date() } });
208
+ await prisma.user.update({ where: { id }, data: { deletedAt: null } }); // restore
209
+ ```
210
+
211
+ ### Error Handling
212
+
213
+ ```ts
214
+ import { Prisma } from '@prisma/client'; // or the generated client path for your setup
215
+
216
+ try {
217
+ await prisma.user.create({ data: { email } });
218
+ } catch (e) {
219
+ if (e instanceof Prisma.PrismaClientKnownRequestError) {
220
+ if (e.code === 'P2002') throw new ConflictError('Email already exists');
221
+ if (e.code === 'P2025') throw new NotFoundError('Record not found');
222
+ if (e.code === 'P2003') throw new BadRequestError('Referenced record does not exist');
223
+ }
224
+ throw e;
225
+ }
226
+ ```
227
+
228
+ Common codes: `P2002` unique violation · `P2025` not found · `P2003` foreign key violation.
229
+
230
+ Catch at the service boundary and translate to domain errors. Never expose raw Prisma messages to API consumers.
231
+
232
+ ### Connection Pool — Serverless
233
+
234
+ Embed connection params directly in `DATABASE_URL` — string concatenation breaks if the URL already has query parameters (e.g. `?schema=public`):
235
+
236
+ ```bash
237
+ # .env — preferred: embed params in the URL
238
+ DATABASE_URL="postgresql://user:pass@host/db?connection_limit=1&pool_timeout=20"
239
+
240
+ # With an external pooler (PgBouncer, Supabase pooler)
241
+ DATABASE_URL="postgresql://user:pass@host/db?pgbouncer=true&connection_limit=1"
242
+ ```
243
+
244
+ ```ts
245
+ // Vercel, AWS Lambda, and similar serverless runtimes:
246
+ // cap pool to 1 per instance; connection_limit and pool_timeout controlled via DATABASE_URL
247
+
248
+ // Adapter-based setup (if your Prisma install requires an adapter):
249
+ import { PrismaClient } from '@prisma/client';
250
+ import { PrismaPg } from '@prisma/adapter-pg';
251
+
252
+ const prisma = new PrismaClient({
253
+ adapter: new PrismaPg({ connectionString: process.env.DATABASE_URL }),
254
+ });
255
+
256
+ // Direct setup (if your Prisma install does not require an adapter):
257
+ // const prisma = new PrismaClient();
258
+ ```
259
+
260
+ ## Anti-Patterns
261
+
262
+ ### `updateMany` returns a count, not records
263
+
264
+ ```ts
265
+ // BAD: result is { count: 2 } — users[0] is undefined
266
+ const users = await prisma.user.updateMany({ where: { role: 'GUEST' }, data: { role: 'USER' } });
267
+
268
+ // GOOD: capture IDs first, then update, then fetch only the affected rows
269
+ const targets = await prisma.user.findMany({
270
+ where: { role: 'GUEST' },
271
+ select: { id: true },
272
+ });
273
+ const ids = targets.map((u) => u.id);
274
+ await prisma.user.updateMany({ where: { id: { in: ids } }, data: { role: 'USER' } });
275
+ const updated = await prisma.user.findMany({ where: { id: { in: ids } } });
276
+ ```
277
+
278
+ Same applies to `deleteMany` — returns `{ count: n }`, never the deleted rows.
279
+
280
+ ### `$transaction` interactive form times out after 5 seconds
281
+
282
+ ```ts
283
+ // BAD: external call inside transaction exceeds 5s default → "Transaction already closed"
284
+ await prisma.$transaction(async (tx) => {
285
+ const user = await tx.user.findUniqueOrThrow({ where: { id } });
286
+ await sendWelcomeEmail(user.email); // external call
287
+ await tx.user.update({ where: { id }, data: { emailSent: true } });
288
+ });
289
+
290
+ // GOOD: external calls outside the transaction
291
+ const user = await prisma.user.findUniqueOrThrow({ where: { id } });
292
+ await sendWelcomeEmail(user.email);
293
+ await prisma.user.update({ where: { id }, data: { emailSent: true } });
294
+
295
+ // Only raise timeout when bulk processing genuinely needs it
296
+ await prisma.$transaction(async (tx) => { ... }, { timeout: 30_000 });
297
+ ```
298
+
299
+ ### `migrate dev` can reset the database
300
+
301
+ `migrate dev` detects schema drift and may prompt to reset the DB, dropping all data.
302
+
303
+ ```bash
304
+ # NEVER on shared dev, staging, or production
305
+ npx prisma migrate dev --name add_column
306
+
307
+ # Safe everywhere except local solo dev
308
+ npx prisma migrate deploy
309
+
310
+ # Check drift without applying
311
+ npx prisma migrate diff \
312
+ --from-migrations ./prisma/migrations \
313
+ --to-schema-datamodel ./prisma/schema.prisma \
314
+ --shadow-database-url "$SHADOW_DATABASE_URL"
315
+ ```
316
+
317
+ ### Manually editing a migration file breaks future deploys
318
+
319
+ Prisma checksums every migration file. Editing after apply causes `P3006 checksum mismatch` on every environment where the original already ran. Create a new migration instead.
320
+
321
+ ### Breaking schema changes require multi-step migration
322
+
323
+ Adding `NOT NULL` to an existing column or renaming a column in one migration will lock the table or drop data. Use expand-and-contract:
324
+
325
+ ```bash
326
+ # Step 1: create migration locally, then deploy
327
+ npx prisma migrate dev --name add_new_column # local only
328
+ npx prisma migrate deploy # staging / production
329
+ ```
330
+
331
+ ```ts
332
+ // Step 2: backfill data (run in a script or migration job, not in the shell)
333
+ await prisma.user.updateMany({ data: { newColumn: derivedValue } });
334
+ ```
335
+
336
+ ```bash
337
+ # Step 3: create the NOT NULL constraint migration locally, then deploy
338
+ npx prisma migrate dev --name make_new_column_required # local only
339
+ npx prisma migrate deploy # staging / production
340
+ ```
341
+
342
+ ### `@updatedAt` does not fire on `updateMany`
343
+
344
+ `@updatedAt` is set automatically only on `update` and `upsert`. Bulk writes leave it stale.
345
+
346
+ ```ts
347
+ // BAD: updatedAt stays at its old value
348
+ await prisma.post.updateMany({ where: { authorId }, data: { published: true } });
349
+
350
+ // GOOD
351
+ await prisma.post.updateMany({
352
+ where: { authorId },
353
+ data: { published: true, updatedAt: new Date() },
354
+ });
355
+ ```
356
+
357
+ ### Soft delete + `findUniqueOrThrow` leaks deleted records
358
+
359
+ `findUniqueOrThrow` throws `P2025` only when the row does not exist in the DB. Soft-deleted rows still exist and are returned without error.
360
+
361
+ `findUniqueOrThrow` requires a unique constraint field in `where` — adding `deletedAt: null` alongside `id` breaks the type because `{ id, deletedAt }` is not a compound unique constraint. Use `findFirstOrThrow` instead.
362
+
363
+ ```ts
364
+ // BAD: returns soft-deleted user
365
+ const user = await prisma.user.findUniqueOrThrow({ where: { id } });
366
+
367
+ // BAD: Prisma type error — { id, deletedAt } is not a unique constraint
368
+ const user = await prisma.user.findUniqueOrThrow({ where: { id, deletedAt: null } });
369
+
370
+ // GOOD: findFirstOrThrow supports arbitrary where conditions
371
+ const user = await prisma.user.findFirstOrThrow({ where: { id, deletedAt: null } });
372
+ ```
373
+
374
+ ### `deleteMany` without `where` deletes every row
375
+
376
+ ```ts
377
+ // BAD: silently wipes the table
378
+ await prisma.post.deleteMany();
379
+
380
+ // GOOD
381
+ await prisma.post.deleteMany({ where: { authorId: userId } });
382
+ ```
383
+
384
+ ## Best Practices
385
+
386
+ | Rule | Reason |
387
+ |---|---|
388
+ | `migrate deploy` in CI/CD, `migrate dev` only locally | `migrate dev` can reset the DB on drift |
389
+ | Map entities to response DTOs | Prevents leaking internal fields |
390
+ | Catch `PrismaClientKnownRequestError` at service boundary | Translate to domain errors |
391
+ | Prefer `*OrThrow` methods over manual null checks | Throws P2025 automatically; use `findFirstOrThrow` when filtering non-unique fields |
392
+ | `connection_limit=1` + external pooler in serverless | Prevents connection exhaustion |
393
+ | Always provide `where` on `deleteMany` | Prevents accidental table wipe |
394
+ | Set `updatedAt: new Date()` manually in `updateMany` | `@updatedAt` skips bulk writes |
395
+
396
+ ## Related Skills
397
+
398
+ - `nestjs-patterns` — NestJS service layer that integrates Prisma
399
+ - `postgres-patterns` — PostgreSQL-level indexing and connection tuning
400
+ - `database-migrations` — multi-step migration planning for production
401
+ - `backend-patterns` — general API and service layer design
@@ -0,0 +1,142 @@
1
+ ---
2
+ name: product-capability
3
+ description: Translate PRD intent, roadmap asks, or product discussions into an implementation-ready capability plan that exposes constraints, invariants, interfaces, and unresolved decisions before multi-service work starts. Use when the user needs an ECC-native PRD-to-SRS lane instead of vague planning prose.
4
+ metadata:
5
+ origin: ECC
6
+ ---
7
+
8
+ # Product Capability
9
+
10
+ This skill turns product intent into explicit engineering constraints.
11
+
12
+ Use it when the gap is not "what should we build?" but "what exactly must be true before implementation starts?"
13
+
14
+ ## When to Use
15
+
16
+ - A PRD, roadmap item, discussion, or founder note exists, but the implementation constraints are still implicit
17
+ - A feature crosses multiple services, repos, or teams and needs a capability contract before coding
18
+ - Product intent is clear, but architecture, data, lifecycle, or policy implications are still fuzzy
19
+ - Senior engineers keep restating the same hidden assumptions during review
20
+ - You need a reusable artifact that can survive across harnesses and sessions
21
+
22
+ ## Canonical Artifact
23
+
24
+ If the repo has a durable product-context file such as `PRODUCT.md`, `docs/product/`, or a program-spec directory, update it there.
25
+
26
+ If no capability manifest exists yet, create one using the template at:
27
+
28
+ - `docs/examples/product-capability-template.md`
29
+
30
+ The goal is not to create another planning stack. The goal is to make hidden capability constraints durable and reusable.
31
+
32
+ ## Non-Negotiable Rules
33
+
34
+ - Do not invent product truth. Mark unresolved questions explicitly.
35
+ - Separate user-visible promises from implementation details.
36
+ - Call out what is fixed policy, what is architecture preference, and what is still open.
37
+ - If the request conflicts with existing repo constraints, say so clearly instead of smoothing it over.
38
+ - Prefer one reusable capability artifact over scattered ad hoc notes.
39
+
40
+ ## Inputs
41
+
42
+ Read only what is needed:
43
+
44
+ 1. Product intent
45
+ - issue, discussion, PRD, roadmap note, founder message
46
+ 2. Current architecture
47
+ - relevant repo docs, contracts, schemas, routes, existing workflows
48
+ 3. Existing capability context
49
+ - `PRODUCT.md`, design docs, RFCs, migration notes, operating-model docs
50
+ 4. Delivery constraints
51
+ - auth, billing, compliance, rollout, backwards compatibility, performance, review policy
52
+
53
+ ## Core Workflow
54
+
55
+ ### 1. Restate the capability
56
+
57
+ Compress the ask into one precise statement:
58
+
59
+ - who the user or operator is
60
+ - what new capability exists after this ships
61
+ - what outcome changes because of it
62
+
63
+ If this statement is weak, the implementation will drift.
64
+
65
+ ### 2. Resolve capability constraints
66
+
67
+ Extract the constraints that must hold before implementation:
68
+
69
+ - business rules
70
+ - scope boundaries
71
+ - invariants
72
+ - trust boundaries
73
+ - data ownership
74
+ - lifecycle transitions
75
+ - rollout / migration requirements
76
+ - failure and recovery expectations
77
+
78
+ These are the things that often live only in senior-engineer memory.
79
+
80
+ ### 3. Define the implementation-facing contract
81
+
82
+ Produce an SRS-style capability plan with:
83
+
84
+ - capability summary
85
+ - explicit non-goals
86
+ - actors and surfaces
87
+ - required states and transitions
88
+ - interfaces / inputs / outputs
89
+ - data model implications
90
+ - security / billing / policy constraints
91
+ - observability and operator requirements
92
+ - open questions blocking implementation
93
+
94
+ ### 4. Translate into execution
95
+
96
+ End with the exact handoff:
97
+
98
+ - ready for direct implementation
99
+ - needs architecture review first
100
+ - needs product clarification first
101
+
102
+ If useful, point to the next ECC-native lane:
103
+
104
+ - `project-flow-ops`
105
+ - `workspace-surface-audit`
106
+ - `api-connector-builder`
107
+ - `dashboard-builder`
108
+ - `tdd-workflow`
109
+ - `verification-loop`
110
+
111
+ ## Output Format
112
+
113
+ Return the result in this order:
114
+
115
+ ```text
116
+ CAPABILITY
117
+ - one-paragraph restatement
118
+
119
+ CONSTRAINTS
120
+ - fixed rules, invariants, and boundaries
121
+
122
+ IMPLEMENTATION CONTRACT
123
+ - actors
124
+ - surfaces
125
+ - states and transitions
126
+ - interface/data implications
127
+
128
+ NON-GOALS
129
+ - what this lane explicitly does not own
130
+
131
+ OPEN QUESTIONS
132
+ - blockers or product decisions still required
133
+
134
+ HANDOFF
135
+ - what should happen next and which ECC lane should take it
136
+ ```
137
+
138
+ ## Good Outcomes
139
+
140
+ - Product intent is now concrete enough to implement without rediscovering hidden constraints mid-PR.
141
+ - Engineering review has a durable artifact instead of relying on memory or Slack context.
142
+ - The resulting plan is reusable across Claude Code, Codex, Cursor, OpenCode, and ECC 2.0 planning surfaces.
@@ -0,0 +1,93 @@
1
+ ---
2
+ name: product-lens
3
+ description: Use this skill to validate the "why" before building, run product diagnostics, and pressure-test product direction before the request becomes an implementation contract.
4
+ metadata:
5
+ origin: ECC
6
+ ---
7
+
8
+ # Product Lens — Think Before You Build
9
+
10
+ This lane owns product diagnosis, not implementation-ready specification writing.
11
+
12
+ If the user needs a durable PRD-to-SRS or capability-contract artifact, hand off to `product-capability`.
13
+
14
+ ## When to Use
15
+
16
+ - Before starting any feature — validate the "why"
17
+ - Weekly product review — are we building the right thing?
18
+ - When stuck choosing between features
19
+ - Before a launch — sanity check the user journey
20
+ - When converting a vague idea into a product brief before engineering planning starts
21
+
22
+ ## How It Works
23
+
24
+ ### Mode 1: Product Diagnostic
25
+
26
+ Like YC office hours but automated. Asks the hard questions:
27
+
28
+ ```
29
+ 1. Who is this for? (specific person, not "developers")
30
+ 2. What's the pain? (quantify: how often, how bad, what do they do today?)
31
+ 3. Why now? (what changed that makes this possible/necessary?)
32
+ 4. What's the 10-star version? (if money/time were unlimited)
33
+ 5. What's the MVP? (smallest thing that proves the thesis)
34
+ 6. What's the anti-goal? (what are you explicitly NOT building?)
35
+ 7. How do you know it's working? (metric, not vibes)
36
+ ```
37
+
38
+ Output: a `PRODUCT-BRIEF.md` with answers, risks, and a go/no-go recommendation.
39
+
40
+ If the result is "yes, build this," the next lane is `product-capability`, not more founder-theater.
41
+
42
+ ### Mode 2: Founder Review
43
+
44
+ Reviews your current project through a founder lens:
45
+
46
+ ```
47
+ 1. Read README, CLAUDE.md, package.json, recent commits
48
+ 2. Infer: what is this trying to be?
49
+ 3. Score: product-market fit signals (0-10)
50
+ - Usage growth trajectory
51
+ - Retention indicators (repeat contributors, return users)
52
+ - Revenue signals (pricing page, billing code, Stripe integration)
53
+ - Competitive moat (what's hard to copy?)
54
+ 4. Identify: the one thing that would 10x this
55
+ 5. Flag: things you're building that don't matter
56
+ ```
57
+
58
+ ### Mode 3: User Journey Audit
59
+
60
+ Maps the actual user experience:
61
+
62
+ ```
63
+ 1. Clone/install the product as a new user
64
+ 2. Document every friction point (confusing steps, errors, missing docs)
65
+ 3. Time each step
66
+ 4. Compare to competitor onboarding
67
+ 5. Score: time-to-value (how long until the user gets their first win?)
68
+ 6. Recommend: top 3 fixes for onboarding
69
+ ```
70
+
71
+ ### Mode 4: Feature Prioritization
72
+
73
+ When you have 10 ideas and need to pick 2:
74
+
75
+ ```
76
+ 1. List all candidate features
77
+ 2. Score each on: impact (1-5) × confidence (1-5) ÷ effort (1-5)
78
+ 3. Rank by ICE score
79
+ 4. Apply constraints: runway, team size, dependencies
80
+ 5. Output: prioritized roadmap with rationale
81
+ ```
82
+
83
+ ## Output
84
+
85
+ All modes output actionable docs, not essays. Every recommendation has a specific next step.
86
+
87
+ ## Integration
88
+
89
+ Pair with:
90
+ - `/browser-qa` to verify the user journey audit findings
91
+ - `/design-system audit` for visual polish assessment
92
+ - `/canary-watch` for post-launch monitoring
93
+ - `product-capability` when the product brief needs to become an implementation-ready capability plan