quiver-cli 0.1.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.
- package/README.md +188 -0
- package/bin/quiver-cli.mjs +2 -0
- package/dist/cli.js +3074 -0
- package/package.json +55 -0
- package/template/.agents/AGENTS.md +25 -0
- package/template/.agents/commands/cp.md +116 -0
- package/template/.agents/commands/next-setup.md +1064 -0
- package/template/.agents/commands/tf-readme.md +38 -0
- package/template/.agents/config.json +60 -0
- package/template/.agents/skills/agent-browser/SKILL.md +55 -0
- package/template/.agents/skills/apps/skybridge/SKILL.md +46 -0
- package/template/.agents/skills/apps/skybridge/references/architecture.md +175 -0
- package/template/.agents/skills/apps/skybridge/references/copy-template.md +24 -0
- package/template/.agents/skills/apps/skybridge/references/csp.md +33 -0
- package/template/.agents/skills/apps/skybridge/references/deploy.md +33 -0
- package/template/.agents/skills/apps/skybridge/references/discover.md +84 -0
- package/template/.agents/skills/apps/skybridge/references/download-file.md +77 -0
- package/template/.agents/skills/apps/skybridge/references/fetch-and-render-data.md +151 -0
- package/template/.agents/skills/apps/skybridge/references/oauth.md +115 -0
- package/template/.agents/skills/apps/skybridge/references/open-external-links.md +71 -0
- package/template/.agents/skills/apps/skybridge/references/prompt-llm.md +20 -0
- package/template/.agents/skills/apps/skybridge/references/publish.md +19 -0
- package/template/.agents/skills/apps/skybridge/references/run-locally.md +51 -0
- package/template/.agents/skills/apps/skybridge/references/state-and-context.md +151 -0
- package/template/.agents/skills/apps/skybridge/references/ui-guidelines.md +205 -0
- package/template/.agents/skills/code/cleanup/SKILL.md +26 -0
- package/template/.agents/skills/code/vercel-react-best-practices/AGENTS.md +3810 -0
- package/template/.agents/skills/code/vercel-react-best-practices/README.md +123 -0
- package/template/.agents/skills/code/vercel-react-best-practices/SKILL.md +149 -0
- package/template/.agents/skills/code/vercel-react-best-practices/metadata.json +15 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/_sections.md +46 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/_template.md +28 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/advanced-effect-event-deps.md +56 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/async-api-routes.md +38 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/async-defer-await.md +82 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/async-dependencies.md +51 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/async-parallel.md +28 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-analyzable-paths.md +63 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-barrel-imports.md +60 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-preload.md +50 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-early-exit.md +50 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-flatmap-filter.md +60 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-index-maps.md +37 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-request-idle-callback.md +105 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-activity.md +26 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-resource-hints.md +85 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-script-defer-async.md +68 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-memo.md +44 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-no-inline-components.md +82 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-use-deferred-value.md +59 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-cache-react.md +76 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-hoist-static-io.md +149 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-no-shared-module-state.md +50 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-parallel-nested-fetching.md +34 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-serialization.md +38 -0
- package/template/.agents/skills/data/prisma-cli/SKILL.md +247 -0
- package/template/.agents/skills/data/prisma-cli/references/db-execute.md +78 -0
- package/template/.agents/skills/data/prisma-cli/references/db-pull.md +185 -0
- package/template/.agents/skills/data/prisma-cli/references/db-push.md +148 -0
- package/template/.agents/skills/data/prisma-cli/references/db-seed.md +188 -0
- package/template/.agents/skills/data/prisma-cli/references/debug.md +46 -0
- package/template/.agents/skills/data/prisma-cli/references/dev.md +157 -0
- package/template/.agents/skills/data/prisma-cli/references/format.md +48 -0
- package/template/.agents/skills/data/prisma-cli/references/generate.md +173 -0
- package/template/.agents/skills/data/prisma-cli/references/init.md +136 -0
- package/template/.agents/skills/data/prisma-cli/references/mcp.md +38 -0
- package/template/.agents/skills/data/prisma-cli/references/migrate-deploy.md +127 -0
- package/template/.agents/skills/data/prisma-cli/references/migrate-dev.md +145 -0
- package/template/.agents/skills/data/prisma-cli/references/migrate-diff.md +89 -0
- package/template/.agents/skills/data/prisma-cli/references/migrate-reset.md +78 -0
- package/template/.agents/skills/data/prisma-cli/references/migrate-resolve.md +57 -0
- package/template/.agents/skills/data/prisma-cli/references/migrate-status.md +65 -0
- package/template/.agents/skills/data/prisma-cli/references/studio.md +137 -0
- package/template/.agents/skills/data/prisma-cli/references/validate.md +53 -0
- package/template/.agents/skills/data/prisma-client-api/SKILL.md +216 -0
- package/template/.agents/skills/data/prisma-client-api/references/client-methods.md +223 -0
- package/template/.agents/skills/data/prisma-client-api/references/constructor.md +208 -0
- package/template/.agents/skills/data/prisma-client-api/references/filters.md +256 -0
- package/template/.agents/skills/data/prisma-client-api/references/model-queries.md +281 -0
- package/template/.agents/skills/data/prisma-client-api/references/query-options.md +276 -0
- package/template/.agents/skills/data/prisma-client-api/references/raw-queries.md +194 -0
- package/template/.agents/skills/data/prisma-client-api/references/relations.md +308 -0
- package/template/.agents/skills/data/prisma-client-api/references/transactions.md +184 -0
- package/template/.agents/skills/design/impeccable/SKILL.md +176 -0
- package/template/.agents/skills/design/impeccable/reference/adapt.md +311 -0
- package/template/.agents/skills/design/impeccable/reference/animate.md +201 -0
- package/template/.agents/skills/design/impeccable/reference/audit.md +133 -0
- package/template/.agents/skills/design/impeccable/reference/bolder.md +113 -0
- package/template/.agents/skills/design/impeccable/reference/brand.md +108 -0
- package/template/.agents/skills/design/impeccable/reference/clarify.md +288 -0
- package/template/.agents/skills/design/impeccable/reference/codex.md +105 -0
- package/template/.agents/skills/design/impeccable/reference/colorize.md +257 -0
- package/template/.agents/skills/design/impeccable/reference/craft.md +123 -0
- package/template/.agents/skills/design/impeccable/reference/critique.md +767 -0
- package/template/.agents/skills/design/impeccable/reference/delight.md +302 -0
- package/template/.agents/skills/design/impeccable/reference/distill.md +111 -0
- package/template/.agents/skills/design/impeccable/reference/document.md +429 -0
- package/template/.agents/skills/design/impeccable/reference/extract.md +69 -0
- package/template/.agents/skills/design/impeccable/reference/harden.md +347 -0
- package/template/.agents/skills/design/impeccable/reference/init.md +172 -0
- package/template/.agents/skills/design/impeccable/reference/interaction-design.md +189 -0
- package/template/.agents/skills/design/impeccable/reference/layout.md +161 -0
- package/template/.agents/skills/design/impeccable/reference/live.md +718 -0
- package/template/.agents/skills/design/impeccable/reference/onboard.md +234 -0
- package/template/.agents/skills/design/impeccable/reference/optimize.md +258 -0
- package/template/.agents/skills/design/impeccable/reference/overdrive.md +130 -0
- package/template/.agents/skills/design/impeccable/reference/polish.md +241 -0
- package/template/.agents/skills/design/impeccable/reference/product.md +60 -0
- package/template/.agents/skills/design/impeccable/reference/quieter.md +99 -0
- package/template/.agents/skills/design/impeccable/reference/shape.md +165 -0
- package/template/.agents/skills/design/impeccable/reference/typeset.md +279 -0
- package/template/.agents/skills/design/impeccable/scripts/cleanup-deprecated.mjs +284 -0
- package/template/.agents/skills/design/impeccable/scripts/command-metadata.json +94 -0
- package/template/.agents/skills/design/impeccable/scripts/context-signals.mjs +225 -0
- package/template/.agents/skills/design/impeccable/scripts/context.mjs +270 -0
- package/template/.agents/skills/design/impeccable/scripts/critique-storage.mjs +242 -0
- package/template/.agents/skills/design/impeccable/scripts/design-parser.mjs +835 -0
- package/template/.agents/skills/design/impeccable/scripts/detect-csp.mjs +198 -0
- package/template/.agents/skills/design/impeccable/scripts/detect.mjs +21 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/browser/injected/index.mjs +1733 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/cli/main.mjs +244 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/detect-antipatterns-browser.js +4551 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/detect-antipatterns.mjs +43 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/engines/browser/detect-url.mjs +252 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/engines/regex/detect-text.mjs +535 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +986 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/engines/static-html/detect-html.mjs +208 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/engines/visual/screenshot-contrast.mjs +189 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/findings.mjs +12 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/node/file-system.mjs +198 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/profile/profiler.mjs +166 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/registry/antipatterns.mjs +419 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/rules/checks.mjs +2316 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/shared/color.mjs +124 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/shared/constants.mjs +101 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/shared/page.mjs +7 -0
- package/template/.agents/skills/design/impeccable/scripts/impeccable-paths.mjs +126 -0
- package/template/.agents/skills/design/impeccable/scripts/is-generated.mjs +69 -0
- package/template/.agents/skills/design/impeccable/scripts/live-accept.mjs +812 -0
- package/template/.agents/skills/design/impeccable/scripts/live-browser-session.js +123 -0
- package/template/.agents/skills/design/impeccable/scripts/live-browser.js +10316 -0
- package/template/.agents/skills/design/impeccable/scripts/live-commit-manual-edits.mjs +1241 -0
- package/template/.agents/skills/design/impeccable/scripts/live-complete.mjs +75 -0
- package/template/.agents/skills/design/impeccable/scripts/live-completion.mjs +19 -0
- package/template/.agents/skills/design/impeccable/scripts/live-copy-edit-agent.mjs +683 -0
- package/template/.agents/skills/design/impeccable/scripts/live-discard-manual-edits.mjs +51 -0
- package/template/.agents/skills/design/impeccable/scripts/live-event-validation.mjs +136 -0
- package/template/.agents/skills/design/impeccable/scripts/live-inject.mjs +557 -0
- package/template/.agents/skills/design/impeccable/scripts/live-insert-ui.mjs +458 -0
- package/template/.agents/skills/design/impeccable/scripts/live-insert.mjs +272 -0
- package/template/.agents/skills/design/impeccable/scripts/live-manual-edit-evidence.mjs +363 -0
- package/template/.agents/skills/design/impeccable/scripts/live-manual-edits-buffer.mjs +152 -0
- package/template/.agents/skills/design/impeccable/scripts/live-poll.mjs +379 -0
- package/template/.agents/skills/design/impeccable/scripts/live-resume.mjs +94 -0
- package/template/.agents/skills/design/impeccable/scripts/live-server.mjs +2322 -0
- package/template/.agents/skills/design/impeccable/scripts/live-session-store.mjs +289 -0
- package/template/.agents/skills/design/impeccable/scripts/live-status.mjs +61 -0
- package/template/.agents/skills/design/impeccable/scripts/live-svelte-component.mjs +826 -0
- package/template/.agents/skills/design/impeccable/scripts/live-sveltekit-adapter.mjs +274 -0
- package/template/.agents/skills/design/impeccable/scripts/live-ui-core.mjs +179 -0
- package/template/.agents/skills/design/impeccable/scripts/live-wrap.mjs +894 -0
- package/template/.agents/skills/design/impeccable/scripts/live.mjs +246 -0
- package/template/.agents/skills/design/impeccable/scripts/modern-screenshot.umd.js +14 -0
- package/template/.agents/skills/design/impeccable/scripts/palette.mjs +633 -0
- package/template/.agents/skills/design/impeccable/scripts/pin.mjs +214 -0
- package/template/.agents/skills/design/shadcn/SKILL.md +242 -0
- package/template/.agents/skills/design/shadcn/agents/openai.yml +5 -0
- package/template/.agents/skills/design/shadcn/assets/shadcn-small.png +0 -0
- package/template/.agents/skills/design/shadcn/assets/shadcn.png +0 -0
- package/template/.agents/skills/design/shadcn/cli.md +257 -0
- package/template/.agents/skills/design/shadcn/customization.md +202 -0
- package/template/.agents/skills/design/shadcn/evals/evals.json +47 -0
- package/template/.agents/skills/design/shadcn/mcp.md +94 -0
- package/template/.agents/skills/design/shadcn/rules/base-vs-radix.md +306 -0
- package/template/.agents/skills/design/shadcn/rules/composition.md +195 -0
- package/template/.agents/skills/design/shadcn/rules/forms.md +192 -0
- package/template/.agents/skills/design/shadcn/rules/icons.md +101 -0
- package/template/.agents/skills/design/shadcn/rules/styling.md +162 -0
- package/template/.agents/skills/find-skills/SKILL.md +142 -0
- package/template/.agents/skills/integrations/langfuse/SKILL.md +142 -0
- package/template/.agents/skills/integrations/langfuse/references/cli.md +52 -0
- package/template/.agents/skills/integrations/langfuse/references/error-analysis.md +100 -0
- package/template/.agents/skills/integrations/langfuse/references/instrumentation.md +134 -0
- package/template/.agents/skills/integrations/langfuse/references/judge-calibration.md +288 -0
- package/template/.agents/skills/integrations/langfuse/references/prompt-migration.md +234 -0
- package/template/.agents/skills/integrations/langfuse/references/sdk-upgrade.md +175 -0
- package/template/.agents/skills/integrations/langfuse/references/skill-feedback.md +52 -0
- package/template/.agents/skills/integrations/langfuse/references/user-feedback.md +88 -0
- package/template/.agents/skills/integrations/posthog/SKILL.md +102 -0
- package/template/.agents/skills/integrations/posthog/references/error-tracking-alerts.md +63 -0
- package/template/.agents/skills/integrations/posthog/references/error-tracking-assigning-issues.md +77 -0
- package/template/.agents/skills/integrations/posthog/references/error-tracking-fingerprints.md +57 -0
- package/template/.agents/skills/integrations/posthog/references/error-tracking-monitoring.md +140 -0
- package/template/.agents/skills/integrations/posthog/references/error-tracking-nextjs.md +490 -0
- package/template/.agents/skills/integrations/posthog/references/error-tracking-source-maps.md +45 -0
- package/template/.agents/skills/integrations/posthog/references/feature-flags-best-practices.md +139 -0
- package/template/.agents/skills/integrations/posthog/references/feature-flags-react.md +302 -0
- package/template/.agents/skills/integrations/posthog/references/identify-users.md +202 -0
- package/template/.agents/skills/integrations/posthog/references/integration-example.md +706 -0
- package/template/.agents/skills/integrations/posthog/references/integration-nextjs.md +385 -0
- package/template/.agents/skills/integrations/posthog/references/integration-step-1-begin.md +43 -0
- package/template/.agents/skills/integrations/posthog/references/integration-step-2-edit.md +37 -0
- package/template/.agents/skills/integrations/posthog/references/integration-step-3-revise.md +22 -0
- package/template/.agents/skills/integrations/posthog/references/integration-step-4-conclude.md +38 -0
- package/template/.agents/skills/integrations/posthog/references/llm-analytics-anthropic.md +200 -0
- package/template/.agents/skills/integrations/posthog/references/llm-analytics-basics.md +62 -0
- package/template/.agents/skills/integrations/posthog/references/llm-analytics-costs.md +197 -0
- package/template/.agents/skills/integrations/posthog/references/llm-analytics-manual-capture.md +397 -0
- package/template/.agents/skills/integrations/posthog/references/llm-analytics-traces.md +98 -0
- package/template/.agents/skills/integrations/posthog/references/llm-analytics-vercel-ai.md +120 -0
- package/template/.agents/skills/repo/repo-ci/SKILL.md +265 -0
- package/template/.agents/skills/repo/repo-init-next-js/SKILL.md +129 -0
- package/template/.agents/skills/repo/repo-init-next-js/references/file-contents.md +800 -0
- package/template/.agents/skills/repo/repo-init-next-js/scripts/setup.sh +47 -0
- package/template/.agents/skills/repo/repo-init-node/SKILL.md +196 -0
- package/template/.agents/skills/skill-creator/LICENSE.txt +202 -0
- package/template/.agents/skills/skill-creator/SKILL.md +485 -0
- package/template/.agents/skills/skill-creator/agents/analyzer.md +274 -0
- package/template/.agents/skills/skill-creator/agents/comparator.md +202 -0
- package/template/.agents/skills/skill-creator/agents/grader.md +223 -0
- package/template/.agents/skills/skill-creator/assets/eval_review.html +146 -0
- package/template/.agents/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/template/.agents/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/template/.agents/skills/skill-creator/references/schemas.md +430 -0
- package/template/.agents/skills/skill-creator/scripts/__init__.py +0 -0
- package/template/.agents/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/template/.agents/skills/skill-creator/scripts/generate_report.py +326 -0
- package/template/.agents/skills/skill-creator/scripts/improve_description.py +247 -0
- package/template/.agents/skills/skill-creator/scripts/package_skill.py +136 -0
- package/template/.agents/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/template/.agents/skills/skill-creator/scripts/run_eval.py +310 -0
- package/template/.agents/skills/skill-creator/scripts/run_loop.py +328 -0
- package/template/.agents/skills/skill-creator/scripts/utils.py +47 -0
- package/template/.agents/upstreams.json +80 -0
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: prisma-client-api
|
|
3
|
+
description: Prisma Client API reference covering model queries, filters, operators, and client methods. Use when writing database queries, using CRUD operations, filtering data, or configuring Prisma Client. Triggers on "prisma query", "findMany", "create", "update", "delete", "$transaction".
|
|
4
|
+
license: MIT
|
|
5
|
+
metadata:
|
|
6
|
+
author: prisma
|
|
7
|
+
version: "7.6.0"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Prisma Client API Reference
|
|
11
|
+
|
|
12
|
+
Complete API reference for Prisma Client. This skill provides guidance on model queries, filtering, relations, and client methods for current Prisma projects.
|
|
13
|
+
|
|
14
|
+
## When to Apply
|
|
15
|
+
|
|
16
|
+
Reference this skill when:
|
|
17
|
+
- Writing database queries with Prisma Client
|
|
18
|
+
- Performing CRUD operations (create, read, update, delete)
|
|
19
|
+
- Filtering and sorting data
|
|
20
|
+
- Working with relations
|
|
21
|
+
- Using transactions
|
|
22
|
+
- Configuring client options
|
|
23
|
+
|
|
24
|
+
## Rule Categories by Priority
|
|
25
|
+
|
|
26
|
+
| Priority | Category | Impact | Prefix |
|
|
27
|
+
|----------|----------|--------|--------|
|
|
28
|
+
| 1 | Client Construction | HIGH | `constructor` |
|
|
29
|
+
| 2 | Model Queries | CRITICAL | `model-queries` |
|
|
30
|
+
| 3 | Query Shape | HIGH | `query-options` |
|
|
31
|
+
| 4 | Filtering | HIGH | `filters` |
|
|
32
|
+
| 5 | Relations | HIGH | `relations` |
|
|
33
|
+
| 6 | Transactions | CRITICAL | `transactions` |
|
|
34
|
+
| 7 | Raw SQL | CRITICAL | `raw-queries` |
|
|
35
|
+
| 8 | Client Methods | MEDIUM | `client-methods` |
|
|
36
|
+
|
|
37
|
+
## Quick Reference
|
|
38
|
+
|
|
39
|
+
- `constructor` - `PrismaClient` setup, adapter wiring, logging, and SQL commenter plugins
|
|
40
|
+
- `model-queries` - CRUD operations and bulk operations
|
|
41
|
+
- `query-options` - `select`, `include`, `omit`, sort, pagination
|
|
42
|
+
- `filters` - scalar and logical filter operators
|
|
43
|
+
- `relations` - relation reads and nested writes
|
|
44
|
+
- `transactions` - array and interactive transaction patterns
|
|
45
|
+
- `raw-queries` - `$queryRaw` and `$executeRaw` safety
|
|
46
|
+
- `client-methods` - lifecycle methods, extensions, and `satisfies` patterns for `prisma-client`
|
|
47
|
+
|
|
48
|
+
## Client Instantiation
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
import { PrismaClient } from '../generated/client'
|
|
52
|
+
import { PrismaPg } from '@prisma/adapter-pg'
|
|
53
|
+
|
|
54
|
+
const adapter = new PrismaPg({
|
|
55
|
+
connectionString: process.env.DATABASE_URL
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
const prisma = new PrismaClient({ adapter })
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Model Query Methods
|
|
62
|
+
|
|
63
|
+
| Method | Description |
|
|
64
|
+
|--------|-------------|
|
|
65
|
+
| `findUnique()` | Find one record by unique field |
|
|
66
|
+
| `findUniqueOrThrow()` | Find one or throw error |
|
|
67
|
+
| `findFirst()` | Find first matching record |
|
|
68
|
+
| `findFirstOrThrow()` | Find first or throw error |
|
|
69
|
+
| `findMany()` | Find multiple records |
|
|
70
|
+
| `create()` | Create a new record |
|
|
71
|
+
| `createMany()` | Create multiple records |
|
|
72
|
+
| `createManyAndReturn()` | Create multiple and return them |
|
|
73
|
+
| `update()` | Update one record |
|
|
74
|
+
| `updateMany()` | Update multiple records |
|
|
75
|
+
| `updateManyAndReturn()` | Update multiple and return them |
|
|
76
|
+
| `upsert()` | Update or create record |
|
|
77
|
+
| `delete()` | Delete one record |
|
|
78
|
+
| `deleteMany()` | Delete multiple records |
|
|
79
|
+
| `count()` | Count matching records |
|
|
80
|
+
| `aggregate()` | Aggregate values (sum, avg, etc.) |
|
|
81
|
+
| `groupBy()` | Group and aggregate |
|
|
82
|
+
|
|
83
|
+
## Query Options
|
|
84
|
+
|
|
85
|
+
| Option | Description |
|
|
86
|
+
|--------|-------------|
|
|
87
|
+
| `where` | Filter conditions |
|
|
88
|
+
| `select` | Fields to include |
|
|
89
|
+
| `include` | Relations to load |
|
|
90
|
+
| `omit` | Fields to exclude |
|
|
91
|
+
| `orderBy` | Sort order |
|
|
92
|
+
| `take` | Limit results |
|
|
93
|
+
| `skip` | Skip results (pagination) |
|
|
94
|
+
| `cursor` | Cursor-based pagination |
|
|
95
|
+
| `distinct` | Unique values only |
|
|
96
|
+
|
|
97
|
+
## Client Methods
|
|
98
|
+
|
|
99
|
+
| Method | Description |
|
|
100
|
+
|--------|-------------|
|
|
101
|
+
| `$connect()` | Explicitly connect to database |
|
|
102
|
+
| `$disconnect()` | Disconnect from database |
|
|
103
|
+
| `$transaction()` | Execute transaction |
|
|
104
|
+
| `$queryRaw()` | Execute raw SQL query |
|
|
105
|
+
| `$executeRaw()` | Execute raw SQL command |
|
|
106
|
+
| `$on()` | Subscribe to events |
|
|
107
|
+
| `$extends()` | Add extensions |
|
|
108
|
+
|
|
109
|
+
## Quick Examples
|
|
110
|
+
|
|
111
|
+
### Find records
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
// Find by unique field
|
|
115
|
+
const user = await prisma.user.findUnique({
|
|
116
|
+
where: { email: 'alice@prisma.io' }
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
// Find with filter
|
|
120
|
+
const users = await prisma.user.findMany({
|
|
121
|
+
where: { role: 'ADMIN' },
|
|
122
|
+
orderBy: { createdAt: 'desc' },
|
|
123
|
+
take: 10
|
|
124
|
+
})
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Create records
|
|
128
|
+
|
|
129
|
+
```typescript
|
|
130
|
+
const user = await prisma.user.create({
|
|
131
|
+
data: {
|
|
132
|
+
email: 'alice@prisma.io',
|
|
133
|
+
name: 'Alice',
|
|
134
|
+
posts: {
|
|
135
|
+
create: { title: 'Hello World' }
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
include: { posts: true }
|
|
139
|
+
})
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Update records
|
|
143
|
+
|
|
144
|
+
```typescript
|
|
145
|
+
const user = await prisma.user.update({
|
|
146
|
+
where: { id: 1 },
|
|
147
|
+
data: { name: 'Alice Smith' }
|
|
148
|
+
})
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Delete records
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
await prisma.user.delete({
|
|
155
|
+
where: { id: 1 }
|
|
156
|
+
})
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Transactions
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
const [user, post] = await prisma.$transaction([
|
|
163
|
+
prisma.user.create({ data: { email: 'alice@prisma.io' } }),
|
|
164
|
+
prisma.post.create({ data: { title: 'Hello', authorId: 1 } })
|
|
165
|
+
])
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## Rule Files
|
|
169
|
+
|
|
170
|
+
Detailed API documentation:
|
|
171
|
+
|
|
172
|
+
```
|
|
173
|
+
references/constructor.md - PrismaClient constructor options
|
|
174
|
+
references/model-queries.md - CRUD operations
|
|
175
|
+
references/query-options.md - select, include, omit, where, orderBy
|
|
176
|
+
references/filters.md - Filter conditions and operators
|
|
177
|
+
references/relations.md - Relation queries and nested operations
|
|
178
|
+
references/transactions.md - Transaction API
|
|
179
|
+
references/raw-queries.md - $queryRaw, $executeRaw
|
|
180
|
+
references/client-methods.md - $connect, $disconnect, $on, $extends
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## Filter Operators
|
|
184
|
+
|
|
185
|
+
| Operator | Description |
|
|
186
|
+
|----------|-------------|
|
|
187
|
+
| `equals` | Exact match |
|
|
188
|
+
| `not` | Not equal |
|
|
189
|
+
| `in` | In array |
|
|
190
|
+
| `notIn` | Not in array |
|
|
191
|
+
| `lt`, `lte` | Less than |
|
|
192
|
+
| `gt`, `gte` | Greater than |
|
|
193
|
+
| `contains` | String contains |
|
|
194
|
+
| `startsWith` | String starts with |
|
|
195
|
+
| `endsWith` | String ends with |
|
|
196
|
+
| `mode` | Case sensitivity |
|
|
197
|
+
|
|
198
|
+
## Relation Filters
|
|
199
|
+
|
|
200
|
+
| Operator | Description |
|
|
201
|
+
|----------|-------------|
|
|
202
|
+
| `some` | At least one related record matches |
|
|
203
|
+
| `every` | All related records match |
|
|
204
|
+
| `none` | No related records match |
|
|
205
|
+
| `is` | Related record matches (1-to-1) |
|
|
206
|
+
| `isNot` | Related record doesn't match |
|
|
207
|
+
|
|
208
|
+
## Resources
|
|
209
|
+
|
|
210
|
+
- [Prisma Client API Reference](https://www.prisma.io/docs/orm/reference/prisma-client-reference)
|
|
211
|
+
- [CRUD Operations](https://www.prisma.io/docs/orm/prisma-client/queries/crud)
|
|
212
|
+
- [Filtering and Sorting](https://www.prisma.io/docs/orm/prisma-client/queries/filtering-and-sorting)
|
|
213
|
+
|
|
214
|
+
## How to Use
|
|
215
|
+
|
|
216
|
+
Pick the category from the table above, then open the matching reference file for implementation details and examples.
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
# Client Methods
|
|
2
|
+
|
|
3
|
+
Prisma Client instance methods.
|
|
4
|
+
|
|
5
|
+
## $connect()
|
|
6
|
+
|
|
7
|
+
Explicitly connect to the database:
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
const prisma = new PrismaClient({ adapter })
|
|
11
|
+
|
|
12
|
+
// Explicit connection
|
|
13
|
+
await prisma.$connect()
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
### When to use
|
|
17
|
+
|
|
18
|
+
Usually not needed - Prisma connects automatically on first query. Use for:
|
|
19
|
+
- Fail fast on startup
|
|
20
|
+
- Health checks
|
|
21
|
+
- Pre-warming connections
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
async function main() {
|
|
25
|
+
try {
|
|
26
|
+
await prisma.$connect()
|
|
27
|
+
console.log('Database connected')
|
|
28
|
+
} catch (e) {
|
|
29
|
+
console.error('Failed to connect:', e)
|
|
30
|
+
process.exit(1)
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## $disconnect()
|
|
36
|
+
|
|
37
|
+
Close database connection:
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
await prisma.$disconnect()
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Graceful shutdown
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
process.on('beforeExit', async () => {
|
|
47
|
+
await prisma.$disconnect()
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
// Or with SIGTERM
|
|
51
|
+
process.on('SIGTERM', async () => {
|
|
52
|
+
await prisma.$disconnect()
|
|
53
|
+
process.exit(0)
|
|
54
|
+
})
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### In tests
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
afterAll(async () => {
|
|
61
|
+
await prisma.$disconnect()
|
|
62
|
+
})
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## $on()
|
|
66
|
+
|
|
67
|
+
Subscribe to events:
|
|
68
|
+
|
|
69
|
+
### Query events
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
const prisma = new PrismaClient({
|
|
73
|
+
adapter,
|
|
74
|
+
log: [{ level: 'query', emit: 'event' }]
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
prisma.$on('query', (e) => {
|
|
78
|
+
console.log('Query:', e.query)
|
|
79
|
+
console.log('Params:', e.params)
|
|
80
|
+
console.log('Duration:', e.duration, 'ms')
|
|
81
|
+
})
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Log events
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
const prisma = new PrismaClient({
|
|
88
|
+
adapter,
|
|
89
|
+
log: [
|
|
90
|
+
{ level: 'info', emit: 'event' },
|
|
91
|
+
{ level: 'warn', emit: 'event' },
|
|
92
|
+
{ level: 'error', emit: 'event' }
|
|
93
|
+
]
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
prisma.$on('info', (e) => console.log(e.message))
|
|
97
|
+
prisma.$on('warn', (e) => console.warn(e.message))
|
|
98
|
+
prisma.$on('error', (e) => console.error(e.message))
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## $extends()
|
|
102
|
+
|
|
103
|
+
Add extensions for custom behavior:
|
|
104
|
+
|
|
105
|
+
### Add custom methods
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
const prisma = new PrismaClient({ adapter }).$extends({
|
|
109
|
+
client: {
|
|
110
|
+
$log: (message: string) => console.log(message)
|
|
111
|
+
}
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
prisma.$log('Hello!')
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Add model methods
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
const prisma = new PrismaClient({ adapter }).$extends({
|
|
121
|
+
model: {
|
|
122
|
+
user: {
|
|
123
|
+
async findByEmail(email: string) {
|
|
124
|
+
return prisma.user.findUnique({ where: { email } })
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
const user = await prisma.user.findByEmail('alice@prisma.io')
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Query extensions
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
const prisma = new PrismaClient({ adapter }).$extends({
|
|
137
|
+
query: {
|
|
138
|
+
user: {
|
|
139
|
+
async findMany({ args, query }) {
|
|
140
|
+
// Add default filter
|
|
141
|
+
args.where = { ...args.where, deletedAt: null }
|
|
142
|
+
return query(args)
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
})
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Result extensions
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
const prisma = new PrismaClient({ adapter }).$extends({
|
|
153
|
+
result: {
|
|
154
|
+
user: {
|
|
155
|
+
fullName: {
|
|
156
|
+
needs: { firstName: true, lastName: true },
|
|
157
|
+
compute(user) {
|
|
158
|
+
return `${user.firstName} ${user.lastName}`
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
})
|
|
164
|
+
|
|
165
|
+
const user = await prisma.user.findFirst()
|
|
166
|
+
console.log(user.fullName) // Computed field
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Chain extensions
|
|
170
|
+
|
|
171
|
+
```typescript
|
|
172
|
+
const prisma = new PrismaClient({ adapter })
|
|
173
|
+
.$extends(loggingExtension)
|
|
174
|
+
.$extends(softDeleteExtension)
|
|
175
|
+
.$extends(computedFieldsExtension)
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## $transaction()
|
|
179
|
+
|
|
180
|
+
See `transactions.md` for details.
|
|
181
|
+
|
|
182
|
+
## $queryRaw() / $executeRaw()
|
|
183
|
+
|
|
184
|
+
See `raw-queries.md` for details.
|
|
185
|
+
|
|
186
|
+
## Type utilities
|
|
187
|
+
|
|
188
|
+
### Prisma namespace
|
|
189
|
+
|
|
190
|
+
```typescript
|
|
191
|
+
import { Prisma } from '../generated/client'
|
|
192
|
+
|
|
193
|
+
// Input types
|
|
194
|
+
type UserCreateInput = Prisma.UserCreateInput
|
|
195
|
+
type UserWhereInput = Prisma.UserWhereInput
|
|
196
|
+
|
|
197
|
+
// Output types
|
|
198
|
+
type User = Prisma.UserGetPayload<{}>
|
|
199
|
+
type UserWithPosts = Prisma.UserGetPayload<{
|
|
200
|
+
include: { posts: true }
|
|
201
|
+
}>
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Type-safe query fragments with satisfies
|
|
205
|
+
|
|
206
|
+
Type-safe query fragments:
|
|
207
|
+
|
|
208
|
+
```typescript
|
|
209
|
+
import { Prisma } from '../generated/client'
|
|
210
|
+
|
|
211
|
+
const userSelect = {
|
|
212
|
+
id: true,
|
|
213
|
+
email: true,
|
|
214
|
+
name: true
|
|
215
|
+
} satisfies Prisma.UserSelect
|
|
216
|
+
|
|
217
|
+
const user = await prisma.user.findUnique({
|
|
218
|
+
where: { id: 1 },
|
|
219
|
+
select: userSelect
|
|
220
|
+
})
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
With the `prisma-client` generator, use TypeScript `satisfies` for typed query fragments. You may still see older examples that use `Prisma.validator()` with `prisma-client-js`.
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
# PrismaClient Constructor
|
|
2
|
+
|
|
3
|
+
Configure Prisma Client when instantiating.
|
|
4
|
+
|
|
5
|
+
## Basic Instantiation
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { PrismaClient } from '../generated/client'
|
|
9
|
+
import { PrismaPg } from '@prisma/adapter-pg'
|
|
10
|
+
|
|
11
|
+
const adapter = new PrismaPg({
|
|
12
|
+
connectionString: process.env.DATABASE_URL
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
const prisma = new PrismaClient({ adapter })
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Constructor Options
|
|
19
|
+
|
|
20
|
+
### adapter (Required for the SQL provider workflow)
|
|
21
|
+
|
|
22
|
+
Driver adapter instance:
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
import { PrismaPg } from '@prisma/adapter-pg'
|
|
26
|
+
|
|
27
|
+
const adapter = new PrismaPg({
|
|
28
|
+
connectionString: process.env.DATABASE_URL
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
const prisma = new PrismaClient({ adapter })
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### accelerateUrl (For Accelerate users)
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
import { withAccelerate } from '@prisma/extension-accelerate'
|
|
38
|
+
|
|
39
|
+
const prisma = new PrismaClient({
|
|
40
|
+
accelerateUrl: process.env.DATABASE_URL, // prisma:// URL
|
|
41
|
+
}).$extends(withAccelerate())
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### log
|
|
45
|
+
|
|
46
|
+
Configure logging:
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
const prisma = new PrismaClient({
|
|
50
|
+
adapter,
|
|
51
|
+
log: ['query', 'info', 'warn', 'error'],
|
|
52
|
+
})
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
#### Log levels
|
|
56
|
+
|
|
57
|
+
| Level | Description |
|
|
58
|
+
|-------|-------------|
|
|
59
|
+
| `query` | All SQL queries |
|
|
60
|
+
| `info` | Informational messages |
|
|
61
|
+
| `warn` | Warnings |
|
|
62
|
+
| `error` | Errors |
|
|
63
|
+
|
|
64
|
+
#### Log to events
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
const prisma = new PrismaClient({
|
|
68
|
+
adapter,
|
|
69
|
+
log: [
|
|
70
|
+
{ level: 'query', emit: 'event' },
|
|
71
|
+
{ level: 'error', emit: 'stdout' },
|
|
72
|
+
],
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
prisma.$on('query', (e) => {
|
|
76
|
+
console.log('Query:', e.query)
|
|
77
|
+
console.log('Duration:', e.duration, 'ms')
|
|
78
|
+
})
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### errorFormat
|
|
82
|
+
|
|
83
|
+
Control error formatting:
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
const prisma = new PrismaClient({
|
|
87
|
+
adapter,
|
|
88
|
+
errorFormat: 'pretty', // 'pretty' | 'colorless' | 'minimal'
|
|
89
|
+
})
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### comments
|
|
93
|
+
|
|
94
|
+
Attach SQL commenter plugins for observability, tracing, or query insights:
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
import { PrismaClient } from '../generated/client'
|
|
98
|
+
import { PrismaPg } from '@prisma/adapter-pg'
|
|
99
|
+
import { prismaQueryInsights } from '@prisma/sqlcommenter-query-insights'
|
|
100
|
+
import { queryTags, withQueryTags } from '@prisma/sqlcommenter-query-tags'
|
|
101
|
+
import { traceContext } from '@prisma/sqlcommenter-trace-context'
|
|
102
|
+
|
|
103
|
+
const prisma = new PrismaClient({
|
|
104
|
+
adapter: new PrismaPg(process.env.DATABASE_URL!),
|
|
105
|
+
comments: [prismaQueryInsights(), traceContext(), queryTags()],
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
await withQueryTags({ route: '/api/users', requestId: 'req-123' }, () =>
|
|
109
|
+
prisma.user.findMany(),
|
|
110
|
+
)
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Use `comments` only for SQL providers. This is the clean way to add trace or query-shape metadata without changing your query calls.
|
|
114
|
+
|
|
115
|
+
### transactionOptions
|
|
116
|
+
|
|
117
|
+
Default transaction settings:
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
const prisma = new PrismaClient({
|
|
121
|
+
adapter,
|
|
122
|
+
transactionOptions: {
|
|
123
|
+
maxWait: 5000, // Max wait to acquire transaction (ms)
|
|
124
|
+
timeout: 10000, // Max transaction duration (ms)
|
|
125
|
+
isolationLevel: 'Serializable',
|
|
126
|
+
},
|
|
127
|
+
})
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Singleton Pattern
|
|
131
|
+
|
|
132
|
+
Prevent multiple client instances in development:
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
// lib/prisma.ts
|
|
136
|
+
import { PrismaClient } from '../generated/client'
|
|
137
|
+
import { PrismaPg } from '@prisma/adapter-pg'
|
|
138
|
+
|
|
139
|
+
const globalForPrisma = globalThis as unknown as {
|
|
140
|
+
prisma: PrismaClient | undefined
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function createPrismaClient() {
|
|
144
|
+
const adapter = new PrismaPg({
|
|
145
|
+
connectionString: process.env.DATABASE_URL!
|
|
146
|
+
})
|
|
147
|
+
return new PrismaClient({ adapter })
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export const prisma = globalForPrisma.prisma ?? createPrismaClient()
|
|
151
|
+
|
|
152
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
153
|
+
globalForPrisma.prisma = prisma
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Next.js Pattern
|
|
158
|
+
|
|
159
|
+
```typescript
|
|
160
|
+
// lib/prisma.ts
|
|
161
|
+
import { PrismaClient } from '@/generated/client'
|
|
162
|
+
import { PrismaPg } from '@prisma/adapter-pg'
|
|
163
|
+
|
|
164
|
+
const createAdapter = () => new PrismaPg({
|
|
165
|
+
connectionString: process.env.DATABASE_URL!
|
|
166
|
+
})
|
|
167
|
+
|
|
168
|
+
const prismaClientSingleton = () => {
|
|
169
|
+
return new PrismaClient({ adapter: createAdapter() })
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
declare const globalThis: {
|
|
173
|
+
prismaGlobal: ReturnType<typeof prismaClientSingleton>
|
|
174
|
+
} & typeof global
|
|
175
|
+
|
|
176
|
+
const prisma = globalThis.prismaGlobal ?? prismaClientSingleton()
|
|
177
|
+
|
|
178
|
+
export default prisma
|
|
179
|
+
|
|
180
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
181
|
+
globalThis.prismaGlobal = prisma
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## Query Events
|
|
186
|
+
|
|
187
|
+
Listen to query events:
|
|
188
|
+
|
|
189
|
+
```typescript
|
|
190
|
+
const prisma = new PrismaClient({
|
|
191
|
+
adapter,
|
|
192
|
+
log: [{ level: 'query', emit: 'event' }],
|
|
193
|
+
})
|
|
194
|
+
|
|
195
|
+
prisma.$on('query', (e) => {
|
|
196
|
+
console.log('Query:', e.query)
|
|
197
|
+
console.log('Params:', e.params)
|
|
198
|
+
console.log('Duration:', e.duration)
|
|
199
|
+
})
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## Log Events
|
|
203
|
+
|
|
204
|
+
```typescript
|
|
205
|
+
prisma.$on('info', (e) => console.log(e.message))
|
|
206
|
+
prisma.$on('warn', (e) => console.warn(e.message))
|
|
207
|
+
prisma.$on('error', (e) => console.error(e.message))
|
|
208
|
+
```
|