create-inox-app 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 +110 -0
- package/dist/cli.js +22196 -0
- package/dist/prompt-Bp8saGVV.js +852 -0
- package/dist/templates/base/.gitignore.hbs +9 -0
- package/dist/templates/base/package.json.hbs +29 -0
- package/dist/templates/base/packages/typescript-config/base.json +17 -0
- package/dist/templates/base/packages/typescript-config/nextjs.json +8 -0
- package/dist/templates/base/packages/typescript-config/package.json +10 -0
- package/dist/templates/base/packages/typescript-config/react-library.json +7 -0
- package/dist/templates/base/turbo.json.hbs +32 -0
- package/dist/templates/ci/.gitlab-ci.yml.hbs +70 -0
- package/dist/templates/ci/scripts/build.sh.hbs +94 -0
- package/dist/templates/ci/scripts/prebuild.sh.hbs +11 -0
- package/dist/templates/claude-config/app/.agents/skills/agent-browser/SKILL.md +325 -0
- package/dist/templates/claude-config/app/.agents/skills/agent-browser/references/authentication.md +202 -0
- package/dist/templates/claude-config/app/.agents/skills/agent-browser/references/commands.md +259 -0
- package/dist/templates/claude-config/app/.agents/skills/agent-browser/references/proxy-support.md +188 -0
- package/dist/templates/claude-config/app/.agents/skills/agent-browser/references/session-management.md +193 -0
- package/dist/templates/claude-config/app/.agents/skills/agent-browser/references/snapshot-refs.md +194 -0
- package/dist/templates/claude-config/app/.agents/skills/agent-browser/references/video-recording.md +173 -0
- package/dist/templates/claude-config/app/.agents/skills/agent-browser/templates/authenticated-session.sh +100 -0
- package/dist/templates/claude-config/app/.agents/skills/agent-browser/templates/capture-workflow.sh +69 -0
- package/dist/templates/claude-config/app/.agents/skills/agent-browser/templates/form-automation.sh +62 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/SKILL.md +150 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/agent.md +131 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/artifact.md +84 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/attachments.md +190 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/audio-player.md +134 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/canvas.md +32 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/chain-of-thought.md +81 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/checkpoint.md +163 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/code-block.md +170 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/commit.md +177 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/confirmation.md +252 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/connection.md +32 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/context.md +126 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/controls.md +30 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/conversation.md +210 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/edge.md +50 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/environment-variables.md +102 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/file-tree.md +72 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/image.md +143 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/inline-citation.md +293 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/jsx-preview.md +101 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/message.md +256 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/mic-selector.md +186 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/model-selector.md +112 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/node.md +71 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/open-in-chat.md +67 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/package-info.md +95 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/panel.md +31 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/persona.md +158 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/plan.md +79 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/prompt-input.md +555 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/queue.md +172 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/reasoning.md +219 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/sandbox.md +126 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/schema-display.md +102 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/shimmer.md +48 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/snippet.md +64 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/sources.md +193 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/speech-input.md +160 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/stack-trace.md +218 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/suggestion.md +121 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/task.md +215 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/terminal.md +103 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/test-results.md +157 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/tool.md +275 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/toolbar.md +30 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/transcription.md +120 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/voice-selector.md +241 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/web-preview.md +197 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/agent.tsx +61 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/artifact.tsx +111 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/attachments-inline.tsx +117 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/attachments-list.tsx +88 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/attachments.tsx +78 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/audio-player-remote.tsx +35 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/audio-player.tsx +69 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/chain-of-thought.tsx +74 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/checkpoint.tsx +90 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/code-block-dark.tsx +46 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/code-block.tsx +115 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/commit.tsx +94 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/confirmation-accepted.tsx +35 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/confirmation-rejected.tsx +35 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/confirmation-request.tsx +54 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/confirmation.tsx +53 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/context.tsx +45 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/conversation.tsx +176 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/environment-variables.tsx +55 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/file-tree-basic.tsx +14 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/file-tree-expanded.tsx +17 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/file-tree-selection.tsx +20 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/file-tree.tsx +38 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/image.tsx +20 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/inline-citation.tsx +95 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/jsx-preview.tsx +99 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/message.tsx +324 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/mic-selector.tsx +46 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/model-selector.tsx +362 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/open-in-chat.tsx +33 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/package-info.tsx +46 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/persona-command.tsx +96 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/persona-glint.tsx +96 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/persona-halo.tsx +96 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/persona-mana.tsx +96 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/persona-obsidian.tsx +96 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/persona-opal.tsx +96 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/plan.tsx +63 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/prompt-input-cursor.tsx +459 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/prompt-input-tooltip.tsx +40 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/prompt-input.tsx +247 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/queue-prompt-input.tsx +367 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/queue.tsx +276 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/reasoning.tsx +67 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/sandbox.tsx +166 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/schema-display-basic.tsx +7 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/schema-display-body.tsx +20 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/schema-display-nested.tsx +23 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/schema-display-params.tsx +16 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/schema-display.tsx +110 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/shimmer-duration.tsx +29 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/shimmer-elements.tsx +39 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/shimmer.tsx +17 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/snippet-plain.tsx +19 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/snippet.tsx +25 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/sources-custom.tsx +34 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/sources.tsx +27 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/speech-input.tsx +79 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/stack-trace-collapsed.tsx +39 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/stack-trace-no-internal.tsx +41 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/stack-trace.tsx +54 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/suggestion-input.tsx +137 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/suggestion.tsx +28 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/task.tsx +60 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/terminal-basic.tsx +7 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/terminal-clear.tsx +19 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/terminal-streaming.tsx +38 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/terminal.tsx +77 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/test-results-basic.tsx +27 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/test-results-errors.tsx +51 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/test-results-suites.tsx +40 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/test-results.tsx +78 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/tool-input-available.tsx +31 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/tool-input-streaming.tsx +30 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/tool-output-available.tsx +76 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/tool-output-error.tsx +45 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/tool.tsx +205 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/transcription.tsx +284 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/voice-selector.tsx +228 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/web-preview.tsx +99 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-sdk/SKILL.md +78 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-sdk/references/ai-gateway.md +66 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-sdk/references/common-errors.md +439 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-sdk/references/devtools.md +52 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-sdk/references/type-safe-agents.md +200 -0
- package/dist/templates/claude-config/app/.agents/skills/better-auth-best-practices/SKILL.md +166 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/SKILL.md +37 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/accessibility.mdx +819 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/as-child.mdx +324 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/composition.mdx +239 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/data-attributes.mdx +413 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/definitions.mdx +258 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/design-tokens.mdx +57 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/docs.mdx +155 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/marketplaces.mdx +144 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/npm.mdx +166 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/polymorphism.mdx +583 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/principles.mdx +61 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/registry.mdx +169 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/state.mdx +99 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/styling.mdx +286 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/types.mdx +191 -0
- package/dist/templates/claude-config/app/.agents/skills/docker-expert/SKILL.md +409 -0
- package/dist/templates/claude-config/app/.agents/skills/email-and-password-best-practices/SKILL.md +224 -0
- package/dist/templates/claude-config/app/.agents/skills/find-skills/SKILL.md +133 -0
- package/dist/templates/claude-config/app/.agents/skills/frontend-design/LICENSE.txt +177 -0
- package/dist/templates/claude-config/app/.agents/skills/frontend-design/SKILL.md +42 -0
- package/dist/templates/claude-config/app/.agents/skills/git-commit/SKILL.md +124 -0
- package/dist/templates/claude-config/app/.agents/skills/gitlab-ci-patterns/SKILL.md +271 -0
- package/dist/templates/claude-config/app/.agents/skills/hono/SKILL.md +90 -0
- package/dist/templates/claude-config/app/.agents/skills/langfuse-observability/SKILL.md +139 -0
- package/dist/templates/claude-config/app/.agents/skills/logging-best-practices/SKILL.md +127 -0
- package/dist/templates/claude-config/app/.agents/skills/logging-best-practices/rules/context.md +157 -0
- package/dist/templates/claude-config/app/.agents/skills/logging-best-practices/rules/pitfalls.md +118 -0
- package/dist/templates/claude-config/app/.agents/skills/logging-best-practices/rules/structure.md +193 -0
- package/dist/templates/claude-config/app/.agents/skills/logging-best-practices/rules/wide-events.md +113 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/SKILL.md +153 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/async-patterns.md +87 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/bundling.md +180 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/data-patterns.md +297 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/debug-tricks.md +105 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/directives.md +73 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/error-handling.md +227 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/file-conventions.md +140 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/font.md +245 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/functions.md +108 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/hydration-error.md +91 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/image.md +173 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/metadata.md +301 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/parallel-routes.md +287 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/route-handlers.md +146 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/rsc-boundaries.md +159 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/runtime-selection.md +39 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/scripts.md +141 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/self-hosting.md +371 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/suspense-boundaries.md +67 -0
- package/dist/templates/claude-config/app/.agents/skills/next-cache-components/SKILL.md +411 -0
- package/dist/templates/claude-config/app/.agents/skills/next-upgrade/SKILL.md +50 -0
- package/dist/templates/claude-config/app/.agents/skills/postgres-drizzle/SKILL.md +179 -0
- package/dist/templates/claude-config/app/.agents/skills/postgres-drizzle/references/CHEATSHEET.md +418 -0
- package/dist/templates/claude-config/app/.agents/skills/postgres-drizzle/references/MIGRATIONS.md +536 -0
- package/dist/templates/claude-config/app/.agents/skills/postgres-drizzle/references/PERFORMANCE.md +559 -0
- package/dist/templates/claude-config/app/.agents/skills/postgres-drizzle/references/POSTGRES.md +588 -0
- package/dist/templates/claude-config/app/.agents/skills/postgres-drizzle/references/QUERIES.md +764 -0
- package/dist/templates/claude-config/app/.agents/skills/postgres-drizzle/references/RELATIONS.md +624 -0
- package/dist/templates/claude-config/app/.agents/skills/postgres-drizzle/references/SCHEMA.md +554 -0
- package/dist/templates/claude-config/app/.agents/skills/skill-creator/LICENSE.txt +202 -0
- package/dist/templates/claude-config/app/.agents/skills/skill-creator/SKILL.md +356 -0
- package/dist/templates/claude-config/app/.agents/skills/skill-creator/references/output-patterns.md +82 -0
- package/dist/templates/claude-config/app/.agents/skills/skill-creator/references/workflows.md +28 -0
- package/dist/templates/claude-config/app/.agents/skills/skill-creator/scripts/init_skill.py +303 -0
- package/dist/templates/claude-config/app/.agents/skills/skill-creator/scripts/package_skill.py +113 -0
- package/dist/templates/claude-config/app/.agents/skills/skill-creator/scripts/quick_validate.py +95 -0
- package/dist/templates/claude-config/app/.agents/skills/streamdown/SKILL.md +164 -0
- package/dist/templates/claude-config/app/.agents/skills/streamdown/assets/examples/basic-streaming.tsx +34 -0
- package/dist/templates/claude-config/app/.agents/skills/streamdown/assets/examples/custom-security.tsx +38 -0
- package/dist/templates/claude-config/app/.agents/skills/streamdown/assets/examples/full-featured.tsx +60 -0
- package/dist/templates/claude-config/app/.agents/skills/streamdown/assets/examples/static-mode.tsx +17 -0
- package/dist/templates/claude-config/app/.agents/skills/streamdown/assets/examples/with-caret.tsx +39 -0
- package/dist/templates/claude-config/app/.agents/skills/streamdown/references/api.md +278 -0
- package/dist/templates/claude-config/app/.agents/skills/streamdown/references/features.md +201 -0
- package/dist/templates/claude-config/app/.agents/skills/streamdown/references/plugins.md +239 -0
- package/dist/templates/claude-config/app/.agents/skills/streamdown/references/security.md +192 -0
- package/dist/templates/claude-config/app/.agents/skills/streamdown/references/styling.md +166 -0
- package/dist/templates/claude-config/app/.agents/skills/tdd/SKILL.md +107 -0
- package/dist/templates/claude-config/app/.agents/skills/tdd/deep-modules.md +33 -0
- package/dist/templates/claude-config/app/.agents/skills/tdd/interface-design.md +31 -0
- package/dist/templates/claude-config/app/.agents/skills/tdd/mocking.md +60 -0
- package/dist/templates/claude-config/app/.agents/skills/tdd/refactoring.md +10 -0
- package/dist/templates/claude-config/app/.agents/skills/tdd/tests.md +61 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/SKILL.md +914 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/command/turborepo.md +70 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/best-practices/RULE.md +241 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/best-practices/dependencies.md +246 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/best-practices/packages.md +335 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/best-practices/structure.md +270 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/boundaries/RULE.md +126 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/caching/RULE.md +107 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/caching/gotchas.md +169 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/caching/remote-cache.md +127 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/ci/RULE.md +79 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/ci/github-actions.md +162 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/ci/patterns.md +145 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/ci/vercel.md +103 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/cli/RULE.md +100 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/cli/commands.md +297 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/configuration/RULE.md +211 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/configuration/global-options.md +191 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/configuration/gotchas.md +348 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/configuration/tasks.md +281 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/environment/RULE.md +96 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/environment/gotchas.md +141 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/environment/modes.md +101 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/filtering/RULE.md +148 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/filtering/patterns.md +152 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/watch/RULE.md +99 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/AGENTS.md +917 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/SKILL.md +88 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md +94 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/rules/architecture-compound-components.md +108 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md +84 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/rules/patterns-explicit-variants.md +94 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/rules/react19-no-forwardref.md +42 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/rules/state-context-interface.md +191 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/rules/state-decouple-implementation.md +103 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/rules/state-lift-state.md +125 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/AGENTS.md +2883 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/SKILL.md +138 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/async-api-routes.md +35 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/async-dependencies.md +48 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/async-parallel.md +24 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/bundle-conditional.md +37 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +48 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +34 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/bundle-preload.md +44 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/client-event-listeners.md +78 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +74 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +110 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-cache-storage.md +68 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-length-check-first.md +50 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +38 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +32 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +36 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +72 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +26 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +77 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +56 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +36 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
- package/dist/templates/claude-config/app/.agents/skills/web-design-guidelines/SKILL.md +40 -0
- package/dist/templates/claude-config/app/.agents/skills/workflow/SKILL.md +181 -0
- package/dist/templates/claude-config/app/.claude/commands/council.md +7 -0
- package/dist/templates/claude-config/app/.claude/commands/deslop.md +25 -0
- package/dist/templates/claude-config/app/.claude/commands/diagram.md +101 -0
- package/dist/templates/claude-config/app/.claude/commands/fix-merge.md +47 -0
- package/dist/templates/claude-config/app/.claude/commands/you-might-not-need-an-effect.md +10 -0
- package/dist/templates/claude-config/app/.claude/hooks/post-tool-use-tracker.sh +187 -0
- package/dist/templates/claude-config/app/.claude/hooks/skill-activation-prompt.sh +5 -0
- package/dist/templates/claude-config/app/.claude/hooks/skill-activation-prompt.ts +134 -0
- package/dist/templates/claude-config/app/.claude/rules/comments.md +12 -0
- package/dist/templates/claude-config/app/.claude/rules/typescript.md +31 -0
- package/dist/templates/claude-config/app/.claude/settings.json.hbs +74 -0
- package/dist/templates/claude-config/app/.claude/skills/skill-rules.json.hbs +309 -0
- package/dist/templates/claude-config/app/AGENTS.md.hbs +185 -0
- package/dist/templates/claude-config/app/CLAUDE.md.hbs +5 -0
- package/dist/templates/claude-config/kustomize/.agents/skills/git-commit/SKILL.md +124 -0
- package/dist/templates/claude-config/kustomize/.agents/skills/k8s-manifest-generator/SKILL.md +534 -0
- package/dist/templates/claude-config/kustomize/.agents/skills/k8s-manifest-generator/assets/configmap-template.yaml +296 -0
- package/dist/templates/claude-config/kustomize/.agents/skills/k8s-manifest-generator/assets/deployment-template.yaml +203 -0
- package/dist/templates/claude-config/kustomize/.agents/skills/k8s-manifest-generator/assets/service-template.yaml +171 -0
- package/dist/templates/claude-config/kustomize/.agents/skills/k8s-manifest-generator/references/deployment-spec.md +780 -0
- package/dist/templates/claude-config/kustomize/.agents/skills/k8s-manifest-generator/references/service-spec.md +748 -0
- package/dist/templates/claude-config/kustomize/.claude/settings.json +42 -0
- package/dist/templates/claude-config/kustomize/.claude/skills/git-commit/SKILL.md +124 -0
- package/dist/templates/claude-config/kustomize/.claude/skills/k8s-manifest-generator/SKILL.md +534 -0
- package/dist/templates/claude-config/kustomize/.claude/skills/k8s-manifest-generator/assets/configmap-template.yaml +296 -0
- package/dist/templates/claude-config/kustomize/.claude/skills/k8s-manifest-generator/assets/deployment-template.yaml +203 -0
- package/dist/templates/claude-config/kustomize/.claude/skills/k8s-manifest-generator/assets/service-template.yaml +171 -0
- package/dist/templates/claude-config/kustomize/.claude/skills/k8s-manifest-generator/references/deployment-spec.md +780 -0
- package/dist/templates/claude-config/kustomize/.claude/skills/k8s-manifest-generator/references/service-spec.md +748 -0
- package/dist/templates/docker/.dockerignore.hbs +8 -0
- package/dist/templates/docker/Dockerfile.hbs +81 -0
- package/dist/templates/docker/docker-compose.yml.hbs +55 -0
- package/dist/templates/kustomize/base/deployments/app.yaml.hbs +44 -0
- package/dist/templates/kustomize/base/ingress/app.yaml.hbs +20 -0
- package/dist/templates/kustomize/base/jobs/app-jobs.yaml.hbs +43 -0
- package/dist/templates/kustomize/base/kustomization.yaml.hbs +13 -0
- package/dist/templates/kustomize/base/secrets/regcred.yaml.hbs +7 -0
- package/dist/templates/kustomize/base/services/app.yaml.hbs +12 -0
- package/dist/templates/kustomize/overlays/{{env}}/configs/app.config.env.hbs +21 -0
- package/dist/templates/kustomize/overlays/{{env}}/configs/paradedb.config.env.hbs +3 -0
- package/dist/templates/kustomize/overlays/{{env}}/deployments/paradedb.yaml.hbs +28 -0
- package/dist/templates/kustomize/overlays/{{env}}/deployments/redis.yaml.hbs +18 -0
- package/dist/templates/kustomize/overlays/{{env}}/kustomization.yaml.hbs +36 -0
- package/dist/templates/kustomize/overlays/{{env}}/patch-operation/ingress-host.yaml.hbs +15 -0
- package/dist/templates/kustomize/overlays/{{env}}/services/paradedb.yaml.hbs +11 -0
- package/dist/templates/kustomize/overlays/{{env}}/services/redis.yaml.hbs +11 -0
- package/dist/templates/kustomize/overlays/{{env}}/storage/paradedb-pvc.yaml.hbs +10 -0
- package/dist/templates/presets/ai-chat-app/apps/web/.env.example +11 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/api/auth/[...all]/route.ts +5 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/api/chat/input-guardrail.ts +47 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/api/chat/route.ts +266 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/api/chat/sessions/[id]/messages/route.ts +38 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/api/chat/sessions/[id]/route.ts +59 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/api/chat/sessions/route.ts +24 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/api/health/route.ts +21 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/chat/[id]/page.tsx +54 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/chat/layout.tsx +23 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/chat/page.tsx +9 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/error.tsx +20 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/global-error.tsx +42 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/globals.css +187 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/layout.tsx.hbs +30 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/login/login-form.tsx +96 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/login/page.tsx +14 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/not-found.tsx +15 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ai-elements/code-block.tsx +518 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ai-elements/context.tsx +356 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ai-elements/conversation.tsx +150 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ai-elements/environment-variables.tsx +303 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ai-elements/message.tsx +295 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ai-elements/prompt-input.tsx +1179 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ai-elements/sources.tsx +54 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ai-elements/tool.tsx +157 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/app-sidebar.tsx +110 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/chat-sessions-provider.tsx +89 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/chat-sidebar-list.tsx +174 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/chat-view.tsx +156 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/accordion.tsx +72 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/alert-dialog.tsx +162 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/alert.tsx +73 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/aspect-ratio.tsx +22 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/avatar.tsx +93 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/badge.tsx +49 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/breadcrumb.tsx +103 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/button-group.tsx +78 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/button.tsx +60 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/calendar.tsx +185 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/card.tsx +92 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/carousel.tsx +231 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/chart.tsx +325 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/checkbox.tsx +28 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/collapsible.tsx +17 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/combobox.tsx +273 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/command.tsx +181 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/context-menu.tsx +245 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/dialog.tsx +135 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/direction.tsx +3 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/drawer.tsx +120 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/dropdown-menu.tsx +258 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/empty.tsx +94 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/field.tsx +224 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/hover-card.tsx +46 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/input-group.tsx +146 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/input-otp.tsx +86 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/input.tsx +20 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/item.tsx +188 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/kbd.tsx +26 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/label.tsx +20 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/menubar.tsx +270 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/native-select.tsx +43 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/navigation-menu.tsx +161 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/pagination.tsx +118 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/popover.tsx +77 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/progress.tsx +66 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/radio-group.tsx +39 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/resizable.tsx +42 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/scroll-area.tsx +51 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/select.tsx +190 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/separator.tsx +21 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/sheet.tsx +125 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/sidebar.tsx +689 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/skeleton.tsx +13 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/slider.tsx +54 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/sonner.tsx +45 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/spinner.tsx +15 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/switch.tsx +32 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/table.tsx +89 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/tabs.tsx +75 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/textarea.tsx +18 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/toggle-group.tsx +87 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/toggle.tsx +44 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/tooltip.tsx +54 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components.json +20 -0
- package/dist/templates/presets/ai-chat-app/apps/web/drizzle.config.ts +10 -0
- package/dist/templates/presets/ai-chat-app/apps/web/env.ts +30 -0
- package/dist/templates/presets/ai-chat-app/apps/web/hooks/use-mobile.ts +19 -0
- package/dist/templates/presets/ai-chat-app/apps/web/instrumentation.ts +21 -0
- package/dist/templates/presets/ai-chat-app/apps/web/lib/auth-client.ts +3 -0
- package/dist/templates/presets/ai-chat-app/apps/web/lib/auth-session.ts +9 -0
- package/dist/templates/presets/ai-chat-app/apps/web/lib/auth.ts +16 -0
- package/dist/templates/presets/ai-chat-app/apps/web/lib/db/index.ts +11 -0
- package/dist/templates/presets/ai-chat-app/apps/web/lib/db/migrate.ts +53 -0
- package/dist/templates/presets/ai-chat-app/apps/web/lib/db/schema.ts +94 -0
- package/dist/templates/presets/ai-chat-app/apps/web/lib/db/seed.ts +123 -0
- package/dist/templates/presets/ai-chat-app/apps/web/lib/group-by-date.ts +34 -0
- package/dist/templates/presets/ai-chat-app/apps/web/lib/logger.ts +21 -0
- package/dist/templates/presets/ai-chat-app/apps/web/lib/openrouter.ts +7 -0
- package/dist/templates/presets/ai-chat-app/apps/web/lib/schemas/auth.ts +8 -0
- package/dist/templates/presets/ai-chat-app/apps/web/lib/utils.ts +4 -0
- package/dist/templates/presets/ai-chat-app/apps/web/next-env.d.ts +6 -0
- package/dist/templates/presets/ai-chat-app/apps/web/next.config.ts +14 -0
- package/dist/templates/presets/ai-chat-app/apps/web/package.json +70 -0
- package/dist/templates/presets/ai-chat-app/apps/web/postcss.config.mjs +7 -0
- package/dist/templates/presets/ai-chat-app/apps/web/proxy.ts +13 -0
- package/dist/templates/presets/ai-chat-app/apps/web/tsconfig.json +14 -0
- package/dist/templates/presets/blank/apps/web/.env.example +1 -0
- package/dist/templates/presets/blank/apps/web/app/api/health/route.ts +11 -0
- package/dist/templates/presets/blank/apps/web/app/globals.css +49 -0
- package/dist/templates/presets/blank/apps/web/app/layout.tsx.hbs +30 -0
- package/dist/templates/presets/blank/apps/web/app/page.tsx.hbs +10 -0
- package/dist/templates/presets/blank/apps/web/env.ts +10 -0
- package/dist/templates/presets/blank/apps/web/next-env.d.ts +2 -0
- package/dist/templates/presets/blank/apps/web/next.config.ts +9 -0
- package/dist/templates/presets/blank/apps/web/package.json.hbs +27 -0
- package/dist/templates/presets/blank/apps/web/postcss.config.mjs +7 -0
- package/dist/templates/presets/blank/apps/web/tsconfig.json +14 -0
- package/dist/templates/tooling/.oxfmtrc.json +6 -0
- package/dist/templates/tooling/.oxlintrc.json +20 -0
- package/dist/templates/tooling/commitlint.config.ts.hbs +3 -0
- package/dist/templates/tooling/lefthook.yml.hbs +25 -0
- package/package.json +47 -0
package/dist/templates/claude-config/app/.agents/skills/postgres-drizzle/references/POSTGRES.md
ADDED
|
@@ -0,0 +1,588 @@
|
|
|
1
|
+
# PostgreSQL 18 Features & Configuration
|
|
2
|
+
|
|
3
|
+
Comprehensive reference for PostgreSQL 18 features, configuration, and best practices.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## PostgreSQL 18 New Features
|
|
8
|
+
|
|
9
|
+
### Asynchronous I/O
|
|
10
|
+
|
|
11
|
+
PostgreSQL 18 introduces AIO for concurrent read operations. Benchmarks show up to 3x improvement for sequential scans.
|
|
12
|
+
|
|
13
|
+
#### io_method Options
|
|
14
|
+
|
|
15
|
+
| Method | Description | Best For |
|
|
16
|
+
|--------|-------------|----------|
|
|
17
|
+
| `sync` | PostgreSQL 17 behavior | Compatibility |
|
|
18
|
+
| `worker` | Background workers (default) | Most workloads |
|
|
19
|
+
| `io_uring` | Linux kernel 5.1+ | Cold cache workloads |
|
|
20
|
+
|
|
21
|
+
#### Configuration
|
|
22
|
+
|
|
23
|
+
```sql
|
|
24
|
+
-- Check current settings
|
|
25
|
+
SHOW io_method;
|
|
26
|
+
SHOW io_workers;
|
|
27
|
+
SHOW effective_io_concurrency;
|
|
28
|
+
SHOW maintenance_io_concurrency;
|
|
29
|
+
|
|
30
|
+
-- Recommended production settings
|
|
31
|
+
ALTER SYSTEM SET io_method = 'worker';
|
|
32
|
+
ALTER SYSTEM SET io_workers = 12; -- ~1/4 of CPU cores
|
|
33
|
+
ALTER SYSTEM SET effective_io_concurrency = 32;
|
|
34
|
+
ALTER SYSTEM SET maintenance_io_concurrency = 16;
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**Supported operations:** Sequential scans, bitmap heap scans, VACUUM.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
### Index Skip Scan
|
|
42
|
+
|
|
43
|
+
B-tree indexes now support skip scan for queries that don't specify leading columns.
|
|
44
|
+
|
|
45
|
+
```sql
|
|
46
|
+
-- Index on (region, status, created_at)
|
|
47
|
+
CREATE INDEX orders_region_status_date ON orders(region, status, created_at);
|
|
48
|
+
|
|
49
|
+
-- This query now uses skip scan (previously full table scan)
|
|
50
|
+
SELECT * FROM orders WHERE status = 'pending';
|
|
51
|
+
-- ~40% faster without changing SQL
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
### UUIDv7 Support
|
|
57
|
+
|
|
58
|
+
Timestamp-ordered UUIDs for better index locality:
|
|
59
|
+
|
|
60
|
+
```sql
|
|
61
|
+
SELECT uuidv7();
|
|
62
|
+
-- Returns: 019470a8-1234-7abc-8def-012345678901
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Advantages over UUIDv4:**
|
|
66
|
+
- Chronologically sortable
|
|
67
|
+
- Better B-tree index performance
|
|
68
|
+
- Reduced index fragmentation
|
|
69
|
+
- Time-based partitioning friendly
|
|
70
|
+
|
|
71
|
+
**In Drizzle:**
|
|
72
|
+
```typescript
|
|
73
|
+
id: uuid('id').primaryKey().default(sql`uuidv7()`),
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
### Virtual Generated Columns
|
|
79
|
+
|
|
80
|
+
Virtual columns compute values at read time (not stored on disk):
|
|
81
|
+
|
|
82
|
+
```sql
|
|
83
|
+
CREATE TABLE products (
|
|
84
|
+
price numeric NOT NULL,
|
|
85
|
+
tax_rate numeric NOT NULL,
|
|
86
|
+
-- Stored (computed at write, stored on disk)
|
|
87
|
+
total_price numeric GENERATED ALWAYS AS (price * (1 + tax_rate)) STORED,
|
|
88
|
+
-- Virtual (computed at read, not stored)
|
|
89
|
+
display_price text GENERATED ALWAYS AS (price::text || ' USD')
|
|
90
|
+
);
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**Note:** Virtual generated columns cannot be indexed.
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
### Temporal Constraints
|
|
98
|
+
|
|
99
|
+
`WITHOUT OVERLAPS` for temporal database patterns:
|
|
100
|
+
|
|
101
|
+
```sql
|
|
102
|
+
CREATE TABLE room_bookings (
|
|
103
|
+
room_id int,
|
|
104
|
+
booking_period tstzrange,
|
|
105
|
+
PRIMARY KEY (room_id, booking_period WITHOUT OVERLAPS)
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
-- Prevents overlapping bookings for the same room
|
|
109
|
+
INSERT INTO room_bookings VALUES (1, '[2024-01-01, 2024-01-05)');
|
|
110
|
+
INSERT INTO room_bookings VALUES (1, '[2024-01-03, 2024-01-07)'); -- Error!
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
### RETURNING Enhancements
|
|
116
|
+
|
|
117
|
+
Access both old and new values in DML:
|
|
118
|
+
|
|
119
|
+
```sql
|
|
120
|
+
-- UPDATE with OLD/NEW access
|
|
121
|
+
UPDATE inventory
|
|
122
|
+
SET quantity = quantity - 10
|
|
123
|
+
WHERE product_id = 123
|
|
124
|
+
RETURNING OLD.quantity AS was, NEW.quantity AS now;
|
|
125
|
+
|
|
126
|
+
-- DELETE with OLD access
|
|
127
|
+
DELETE FROM audit_log
|
|
128
|
+
WHERE created_at < now() - interval '90 days'
|
|
129
|
+
RETURNING OLD.*;
|
|
130
|
+
|
|
131
|
+
-- MERGE with RETURNING
|
|
132
|
+
MERGE INTO products t
|
|
133
|
+
USING staging s ON t.sku = s.sku
|
|
134
|
+
WHEN MATCHED THEN UPDATE SET price = s.price
|
|
135
|
+
WHEN NOT MATCHED THEN INSERT VALUES (s.*)
|
|
136
|
+
RETURNING *;
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
### Data Checksums by Default
|
|
142
|
+
|
|
143
|
+
PostgreSQL 18 enables data checksums by default for new clusters, protecting against silent data corruption.
|
|
144
|
+
|
|
145
|
+
```sql
|
|
146
|
+
SHOW data_checksums; -- on
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Memory Configuration
|
|
152
|
+
|
|
153
|
+
### shared_buffers
|
|
154
|
+
|
|
155
|
+
PostgreSQL's main memory cache. Set to ~25% of total RAM.
|
|
156
|
+
|
|
157
|
+
```sql
|
|
158
|
+
-- For 32GB RAM server
|
|
159
|
+
ALTER SYSTEM SET shared_buffers = '8GB';
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### work_mem
|
|
163
|
+
|
|
164
|
+
Memory for sort and hash operations per query.
|
|
165
|
+
|
|
166
|
+
| Workload | Recommendation |
|
|
167
|
+
|----------|----------------|
|
|
168
|
+
| OLTP | 4-16 MB |
|
|
169
|
+
| OLAP | 64-256 MB |
|
|
170
|
+
| Mixed | 16-64 MB |
|
|
171
|
+
|
|
172
|
+
```sql
|
|
173
|
+
-- Set globally
|
|
174
|
+
ALTER SYSTEM SET work_mem = '32MB';
|
|
175
|
+
|
|
176
|
+
-- Or per-session for large queries
|
|
177
|
+
SET work_mem = '256MB';
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**Warning:** Total memory = `work_mem × max_connections × operations_per_query`
|
|
181
|
+
|
|
182
|
+
### maintenance_work_mem
|
|
183
|
+
|
|
184
|
+
Memory for VACUUM, CREATE INDEX, and maintenance operations:
|
|
185
|
+
|
|
186
|
+
```sql
|
|
187
|
+
ALTER SYSTEM SET maintenance_work_mem = '1GB';
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### effective_cache_size
|
|
191
|
+
|
|
192
|
+
Hint to planner about OS cache. Set to 50-75% of total RAM:
|
|
193
|
+
|
|
194
|
+
```sql
|
|
195
|
+
-- For 32GB RAM
|
|
196
|
+
ALTER SYSTEM SET effective_cache_size = '20GB';
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## Row-Level Security (RLS)
|
|
202
|
+
|
|
203
|
+
### Enable RLS
|
|
204
|
+
|
|
205
|
+
```sql
|
|
206
|
+
ALTER TABLE documents ENABLE ROW LEVEL SECURITY;
|
|
207
|
+
|
|
208
|
+
-- Force owner to also follow RLS (optional)
|
|
209
|
+
ALTER TABLE documents FORCE ROW LEVEL SECURITY;
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### Policy Types
|
|
213
|
+
|
|
214
|
+
| Type | Behavior |
|
|
215
|
+
|------|----------|
|
|
216
|
+
| PERMISSIVE (default) | Any matching policy grants access (OR) |
|
|
217
|
+
| RESTRICTIVE | All policies must pass (AND) |
|
|
218
|
+
|
|
219
|
+
### Multi-Tenant Pattern
|
|
220
|
+
|
|
221
|
+
```sql
|
|
222
|
+
-- Set tenant context per connection/transaction
|
|
223
|
+
SET app.current_tenant_id = 'tenant-123';
|
|
224
|
+
|
|
225
|
+
-- Create policy
|
|
226
|
+
CREATE POLICY tenant_isolation ON documents
|
|
227
|
+
FOR ALL
|
|
228
|
+
TO application_role
|
|
229
|
+
USING (tenant_id = current_setting('app.current_tenant_id')::uuid)
|
|
230
|
+
WITH CHECK (tenant_id = current_setting('app.current_tenant_id')::uuid);
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### Command-Specific Policies
|
|
234
|
+
|
|
235
|
+
```sql
|
|
236
|
+
-- SELECT only
|
|
237
|
+
CREATE POLICY select_own ON documents
|
|
238
|
+
FOR SELECT
|
|
239
|
+
USING (owner_id = current_user_id());
|
|
240
|
+
|
|
241
|
+
-- INSERT only
|
|
242
|
+
CREATE POLICY insert_own ON documents
|
|
243
|
+
FOR INSERT
|
|
244
|
+
WITH CHECK (owner_id = current_user_id());
|
|
245
|
+
|
|
246
|
+
-- UPDATE (both USING and WITH CHECK)
|
|
247
|
+
CREATE POLICY update_own ON documents
|
|
248
|
+
FOR UPDATE
|
|
249
|
+
USING (owner_id = current_user_id())
|
|
250
|
+
WITH CHECK (owner_id = current_user_id());
|
|
251
|
+
|
|
252
|
+
-- DELETE
|
|
253
|
+
CREATE POLICY delete_own ON documents
|
|
254
|
+
FOR DELETE
|
|
255
|
+
USING (owner_id = current_user_id());
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### Using with Drizzle
|
|
259
|
+
|
|
260
|
+
```typescript
|
|
261
|
+
// Set tenant context before queries
|
|
262
|
+
await db.execute(sql`SET app.current_tenant_id = ${tenantId}`);
|
|
263
|
+
|
|
264
|
+
// Or use transaction
|
|
265
|
+
await db.transaction(async (tx) => {
|
|
266
|
+
await tx.execute(sql`SET LOCAL app.current_tenant_id = ${tenantId}`);
|
|
267
|
+
// Queries now filtered by RLS
|
|
268
|
+
const docs = await tx.select().from(documents);
|
|
269
|
+
});
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
274
|
+
## Table Partitioning
|
|
275
|
+
|
|
276
|
+
### When to Partition
|
|
277
|
+
|
|
278
|
+
- Tables > 100GB
|
|
279
|
+
- Clear partition key (dates, tenant IDs)
|
|
280
|
+
- Queries frequently filter on partition key
|
|
281
|
+
- Need to archive/drop old data efficiently
|
|
282
|
+
|
|
283
|
+
### Range Partitioning (Time-Series)
|
|
284
|
+
|
|
285
|
+
```sql
|
|
286
|
+
CREATE TABLE events (
|
|
287
|
+
id uuid PRIMARY KEY DEFAULT uuidv7(),
|
|
288
|
+
event_type text NOT NULL,
|
|
289
|
+
data jsonb,
|
|
290
|
+
created_at timestamptz NOT NULL DEFAULT now()
|
|
291
|
+
) PARTITION BY RANGE (created_at);
|
|
292
|
+
|
|
293
|
+
-- Create partitions
|
|
294
|
+
CREATE TABLE events_2025_01 PARTITION OF events
|
|
295
|
+
FOR VALUES FROM ('2025-01-01') TO ('2025-02-01');
|
|
296
|
+
|
|
297
|
+
CREATE TABLE events_2025_02 PARTITION OF events
|
|
298
|
+
FOR VALUES FROM ('2025-02-01') TO ('2025-03-01');
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
### List Partitioning (Categories)
|
|
302
|
+
|
|
303
|
+
```sql
|
|
304
|
+
CREATE TABLE orders (
|
|
305
|
+
id uuid PRIMARY KEY DEFAULT uuidv7(),
|
|
306
|
+
region text NOT NULL,
|
|
307
|
+
total numeric
|
|
308
|
+
) PARTITION BY LIST (region);
|
|
309
|
+
|
|
310
|
+
CREATE TABLE orders_na PARTITION OF orders
|
|
311
|
+
FOR VALUES IN ('US', 'CA', 'MX');
|
|
312
|
+
|
|
313
|
+
CREATE TABLE orders_eu PARTITION OF orders
|
|
314
|
+
FOR VALUES IN ('UK', 'DE', 'FR');
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
### Hash Partitioning (Even Distribution)
|
|
318
|
+
|
|
319
|
+
```sql
|
|
320
|
+
CREATE TABLE user_events (
|
|
321
|
+
id uuid PRIMARY KEY DEFAULT uuidv7(),
|
|
322
|
+
user_id uuid NOT NULL,
|
|
323
|
+
data jsonb
|
|
324
|
+
) PARTITION BY HASH (user_id);
|
|
325
|
+
|
|
326
|
+
CREATE TABLE user_events_0 PARTITION OF user_events
|
|
327
|
+
FOR VALUES WITH (MODULUS 4, REMAINDER 0);
|
|
328
|
+
CREATE TABLE user_events_1 PARTITION OF user_events
|
|
329
|
+
FOR VALUES WITH (MODULUS 4, REMAINDER 1);
|
|
330
|
+
-- etc.
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
### Partition Management
|
|
334
|
+
|
|
335
|
+
```sql
|
|
336
|
+
-- Detach old partition (fast, no lock)
|
|
337
|
+
ALTER TABLE events DETACH PARTITION events_2024_01 CONCURRENTLY;
|
|
338
|
+
|
|
339
|
+
-- Drop detached partition
|
|
340
|
+
DROP TABLE events_2024_01;
|
|
341
|
+
|
|
342
|
+
-- Attach new partition
|
|
343
|
+
ALTER TABLE events ATTACH PARTITION events_2025_03
|
|
344
|
+
FOR VALUES FROM ('2025-03-01') TO ('2025-04-01');
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
---
|
|
348
|
+
|
|
349
|
+
## JSONB Operations
|
|
350
|
+
|
|
351
|
+
### Operators
|
|
352
|
+
|
|
353
|
+
| Operator | Description | Example |
|
|
354
|
+
|----------|-------------|---------|
|
|
355
|
+
| `->` | Get JSON object field | `data->'name'` |
|
|
356
|
+
| `->>` | Get JSON field as text | `data->>'name'` |
|
|
357
|
+
| `#>` | Get nested field | `data#>'{address,city}'` |
|
|
358
|
+
| `#>>` | Get nested field as text | `data#>>'{address,city}'` |
|
|
359
|
+
| `@>` | Contains | `data @> '{"active":true}'` |
|
|
360
|
+
| `<@` | Contained by | `'{"a":1}' <@ data` |
|
|
361
|
+
| `?` | Key exists | `data ? 'name'` |
|
|
362
|
+
| `?\|` | Any key exists | `data ?\| array['a','b']` |
|
|
363
|
+
| `?&` | All keys exist | `data ?& array['a','b']` |
|
|
364
|
+
|
|
365
|
+
### JSONB Functions
|
|
366
|
+
|
|
367
|
+
```sql
|
|
368
|
+
-- Build JSON
|
|
369
|
+
SELECT jsonb_build_object('name', 'John', 'age', 30);
|
|
370
|
+
|
|
371
|
+
-- Aggregate to array
|
|
372
|
+
SELECT jsonb_agg(row_to_json(users)) FROM users;
|
|
373
|
+
|
|
374
|
+
-- Extract keys
|
|
375
|
+
SELECT jsonb_object_keys(data) FROM events;
|
|
376
|
+
|
|
377
|
+
-- Update nested value
|
|
378
|
+
UPDATE users
|
|
379
|
+
SET data = jsonb_set(data, '{preferences,theme}', '"dark"')
|
|
380
|
+
WHERE id = 1;
|
|
381
|
+
|
|
382
|
+
-- Remove key
|
|
383
|
+
UPDATE users
|
|
384
|
+
SET data = data - 'deprecated_field'
|
|
385
|
+
WHERE id = 1;
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
### JSONB Path Queries (SQL/JSON)
|
|
389
|
+
|
|
390
|
+
```sql
|
|
391
|
+
-- JSONPath query
|
|
392
|
+
SELECT * FROM events
|
|
393
|
+
WHERE data @? '$.items[*] ? (@.price > 100)';
|
|
394
|
+
|
|
395
|
+
-- Extract with path
|
|
396
|
+
SELECT jsonb_path_query(data, '$.items[*].name') FROM orders;
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
---
|
|
400
|
+
|
|
401
|
+
## Full-Text Search
|
|
402
|
+
|
|
403
|
+
### Basic Setup
|
|
404
|
+
|
|
405
|
+
```sql
|
|
406
|
+
-- Add search column
|
|
407
|
+
ALTER TABLE posts ADD COLUMN search_vector tsvector;
|
|
408
|
+
|
|
409
|
+
-- Create GIN index
|
|
410
|
+
CREATE INDEX posts_search_idx ON posts USING gin(search_vector);
|
|
411
|
+
|
|
412
|
+
-- Create trigger to update vector
|
|
413
|
+
CREATE FUNCTION posts_search_trigger() RETURNS trigger AS $$
|
|
414
|
+
BEGIN
|
|
415
|
+
NEW.search_vector := to_tsvector('english',
|
|
416
|
+
coalesce(NEW.title, '') || ' ' || coalesce(NEW.content, '')
|
|
417
|
+
);
|
|
418
|
+
RETURN NEW;
|
|
419
|
+
END;
|
|
420
|
+
$$ LANGUAGE plpgsql;
|
|
421
|
+
|
|
422
|
+
CREATE TRIGGER posts_search_update
|
|
423
|
+
BEFORE INSERT OR UPDATE ON posts
|
|
424
|
+
FOR EACH ROW EXECUTE FUNCTION posts_search_trigger();
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
### Querying
|
|
428
|
+
|
|
429
|
+
```sql
|
|
430
|
+
-- Basic search
|
|
431
|
+
SELECT * FROM posts
|
|
432
|
+
WHERE search_vector @@ plainto_tsquery('english', 'database optimization');
|
|
433
|
+
|
|
434
|
+
-- Ranked results
|
|
435
|
+
SELECT *, ts_rank(search_vector, query) AS rank
|
|
436
|
+
FROM posts, plainto_tsquery('english', 'database') AS query
|
|
437
|
+
WHERE search_vector @@ query
|
|
438
|
+
ORDER BY rank DESC;
|
|
439
|
+
|
|
440
|
+
-- Headline (highlighted snippets)
|
|
441
|
+
SELECT ts_headline('english', content, query)
|
|
442
|
+
FROM posts, plainto_tsquery('english', 'database') AS query
|
|
443
|
+
WHERE search_vector @@ query;
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
### In Drizzle
|
|
447
|
+
|
|
448
|
+
```typescript
|
|
449
|
+
const searchResults = await db
|
|
450
|
+
.select()
|
|
451
|
+
.from(posts)
|
|
452
|
+
.where(sql`${posts.searchVector} @@ plainto_tsquery('english', ${searchTerm})`)
|
|
453
|
+
.orderBy(sql`ts_rank(${posts.searchVector}, plainto_tsquery('english', ${searchTerm})) DESC`);
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
---
|
|
457
|
+
|
|
458
|
+
## Useful System Views
|
|
459
|
+
|
|
460
|
+
### Connection Info
|
|
461
|
+
|
|
462
|
+
```sql
|
|
463
|
+
-- Active connections
|
|
464
|
+
SELECT * FROM pg_stat_activity;
|
|
465
|
+
|
|
466
|
+
-- Connection count by state
|
|
467
|
+
SELECT state, count(*)
|
|
468
|
+
FROM pg_stat_activity
|
|
469
|
+
GROUP BY state;
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
### Table Statistics
|
|
473
|
+
|
|
474
|
+
```sql
|
|
475
|
+
-- Table sizes
|
|
476
|
+
SELECT
|
|
477
|
+
tablename,
|
|
478
|
+
pg_size_pretty(pg_total_relation_size(schemaname || '.' || tablename)) AS total_size
|
|
479
|
+
FROM pg_tables
|
|
480
|
+
WHERE schemaname = 'public'
|
|
481
|
+
ORDER BY pg_total_relation_size(schemaname || '.' || tablename) DESC;
|
|
482
|
+
|
|
483
|
+
-- Row counts and dead tuples
|
|
484
|
+
SELECT
|
|
485
|
+
relname,
|
|
486
|
+
n_live_tup,
|
|
487
|
+
n_dead_tup,
|
|
488
|
+
last_vacuum,
|
|
489
|
+
last_autovacuum
|
|
490
|
+
FROM pg_stat_user_tables;
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
### Index Usage
|
|
494
|
+
|
|
495
|
+
```sql
|
|
496
|
+
-- Index usage statistics
|
|
497
|
+
SELECT
|
|
498
|
+
indexrelname,
|
|
499
|
+
idx_scan,
|
|
500
|
+
idx_tup_read,
|
|
501
|
+
idx_tup_fetch
|
|
502
|
+
FROM pg_stat_user_indexes
|
|
503
|
+
ORDER BY idx_scan DESC;
|
|
504
|
+
|
|
505
|
+
-- Unused indexes
|
|
506
|
+
SELECT
|
|
507
|
+
indexrelname,
|
|
508
|
+
pg_size_pretty(pg_relation_size(indexrelid)) AS size
|
|
509
|
+
FROM pg_stat_user_indexes
|
|
510
|
+
WHERE idx_scan = 0
|
|
511
|
+
ORDER BY pg_relation_size(indexrelid) DESC;
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
### Lock Monitoring
|
|
515
|
+
|
|
516
|
+
```sql
|
|
517
|
+
-- Current locks
|
|
518
|
+
SELECT
|
|
519
|
+
pg_locks.pid,
|
|
520
|
+
pg_class.relname,
|
|
521
|
+
pg_locks.mode,
|
|
522
|
+
pg_locks.granted
|
|
523
|
+
FROM pg_locks
|
|
524
|
+
JOIN pg_class ON pg_locks.relation = pg_class.oid
|
|
525
|
+
WHERE pg_class.relkind = 'r';
|
|
526
|
+
|
|
527
|
+
-- Blocking queries
|
|
528
|
+
SELECT
|
|
529
|
+
blocked.pid AS blocked_pid,
|
|
530
|
+
blocking.pid AS blocking_pid,
|
|
531
|
+
blocked.query AS blocked_query
|
|
532
|
+
FROM pg_stat_activity blocked
|
|
533
|
+
JOIN pg_locks blocked_locks ON blocked.pid = blocked_locks.pid
|
|
534
|
+
JOIN pg_locks blocking_locks ON blocked_locks.locktype = blocking_locks.locktype
|
|
535
|
+
AND blocked_locks.relation = blocking_locks.relation
|
|
536
|
+
JOIN pg_stat_activity blocking ON blocking_locks.pid = blocking.pid
|
|
537
|
+
WHERE NOT blocked_locks.granted;
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
---
|
|
541
|
+
|
|
542
|
+
## Maintenance
|
|
543
|
+
|
|
544
|
+
### Autovacuum Tuning
|
|
545
|
+
|
|
546
|
+
```sql
|
|
547
|
+
-- Global settings
|
|
548
|
+
ALTER SYSTEM SET autovacuum_vacuum_scale_factor = 0.1; -- default 0.2
|
|
549
|
+
ALTER SYSTEM SET autovacuum_analyze_scale_factor = 0.05; -- default 0.1
|
|
550
|
+
|
|
551
|
+
-- Per-table for high-write tables
|
|
552
|
+
ALTER TABLE events SET (
|
|
553
|
+
autovacuum_vacuum_scale_factor = 0.01,
|
|
554
|
+
autovacuum_analyze_scale_factor = 0.005
|
|
555
|
+
);
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
### Reindexing
|
|
559
|
+
|
|
560
|
+
```sql
|
|
561
|
+
-- Rebuild without locking (CONCURRENTLY)
|
|
562
|
+
REINDEX INDEX CONCURRENTLY orders_user_idx;
|
|
563
|
+
|
|
564
|
+
-- Rebuild all indexes on table
|
|
565
|
+
REINDEX TABLE CONCURRENTLY orders;
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
### Checkpoints
|
|
569
|
+
|
|
570
|
+
```sql
|
|
571
|
+
-- Reduce checkpoint frequency for lower I/O
|
|
572
|
+
ALTER SYSTEM SET checkpoint_timeout = '15min'; -- default 5min
|
|
573
|
+
ALTER SYSTEM SET max_wal_size = '4GB'; -- default 1GB
|
|
574
|
+
```
|
|
575
|
+
|
|
576
|
+
### Statistics
|
|
577
|
+
|
|
578
|
+
```sql
|
|
579
|
+
-- Update statistics for a table
|
|
580
|
+
ANALYZE orders;
|
|
581
|
+
|
|
582
|
+
-- Update all statistics
|
|
583
|
+
ANALYZE;
|
|
584
|
+
|
|
585
|
+
-- Check when last analyzed
|
|
586
|
+
SELECT relname, last_analyze, last_autoanalyze
|
|
587
|
+
FROM pg_stat_user_tables;
|
|
588
|
+
```
|