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
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: logging-best-practices
|
|
3
|
+
description: Logging best practices focused on wide events (canonical log lines) for powerful debugging and analytics
|
|
4
|
+
license: MIT
|
|
5
|
+
metadata:
|
|
6
|
+
author: boristane
|
|
7
|
+
version: "1.0.0"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Logging Best Practices Skill
|
|
11
|
+
|
|
12
|
+
Version: 1.0.0
|
|
13
|
+
|
|
14
|
+
## Purpose
|
|
15
|
+
|
|
16
|
+
This skill provides guidelines for implementing effective logging in applications. It focuses on **wide events** (also called canonical log lines) - a pattern where you emit a single, context-rich event per request per service, enabling powerful debugging and analytics.
|
|
17
|
+
|
|
18
|
+
## When to Apply
|
|
19
|
+
|
|
20
|
+
Apply these guidelines when:
|
|
21
|
+
- Writing or reviewing logging code
|
|
22
|
+
- Adding console.log, logger.info, or similar
|
|
23
|
+
- Designing logging strategy for new services
|
|
24
|
+
- Setting up logging infrastructure
|
|
25
|
+
|
|
26
|
+
## Core Principles
|
|
27
|
+
|
|
28
|
+
### 1. Wide Events (CRITICAL)
|
|
29
|
+
|
|
30
|
+
Emit **one context-rich event per request per service**. Instead of scattering log lines throughout your handler, consolidate everything into a single structured event emitted at request completion.
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
const wideEvent: Record<string, unknown> = {
|
|
34
|
+
method: 'POST',
|
|
35
|
+
path: '/checkout',
|
|
36
|
+
requestId: c.get('requestId'),
|
|
37
|
+
timestamp: new Date().toISOString(),
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
try {
|
|
41
|
+
const user = await getUser(c.get('userId'));
|
|
42
|
+
wideEvent.user = { id: user.id, subscription: user.subscription };
|
|
43
|
+
|
|
44
|
+
const cart = await getCart(user.id);
|
|
45
|
+
wideEvent.cart = { total_cents: cart.total, item_count: cart.items.length };
|
|
46
|
+
|
|
47
|
+
wideEvent.status_code = 200;
|
|
48
|
+
wideEvent.outcome = 'success';
|
|
49
|
+
return c.json({ success: true });
|
|
50
|
+
} catch (error) {
|
|
51
|
+
wideEvent.status_code = 500;
|
|
52
|
+
wideEvent.outcome = 'error';
|
|
53
|
+
wideEvent.error = { message: error.message, type: error.name };
|
|
54
|
+
throw error;
|
|
55
|
+
} finally {
|
|
56
|
+
wideEvent.duration_ms = Date.now() - startTime;
|
|
57
|
+
logger.info(wideEvent);
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 2. High Cardinality & Dimensionality (CRITICAL)
|
|
62
|
+
|
|
63
|
+
Include fields with high cardinality (user IDs, request IDs - millions of unique values) and high dimensionality (many fields per event). This enables querying by specific users and answering questions you haven't anticipated yet.
|
|
64
|
+
|
|
65
|
+
### 3. Business Context (CRITICAL)
|
|
66
|
+
|
|
67
|
+
Always include business context: user subscription tier, cart value, feature flags, account age. The goal is to know "a premium customer couldn't complete a $2,499 purchase" not just "checkout failed."
|
|
68
|
+
|
|
69
|
+
### 4. Environment Characteristics (CRITICAL)
|
|
70
|
+
|
|
71
|
+
Include environment and deployment info in every event: commit hash, service version, region, instance ID. This enables correlating issues with deployments and identifying region-specific problems.
|
|
72
|
+
|
|
73
|
+
### 5. Single Logger (HIGH)
|
|
74
|
+
|
|
75
|
+
Use one logger instance configured at startup and import it everywhere. This ensures consistent formatting and automatic environment context.
|
|
76
|
+
|
|
77
|
+
### 6. Middleware Pattern (HIGH)
|
|
78
|
+
|
|
79
|
+
Use middleware to handle wide event infrastructure (timing, status, environment, emission). Handlers should only add business context.
|
|
80
|
+
|
|
81
|
+
### 7. Structure & Consistency (HIGH)
|
|
82
|
+
|
|
83
|
+
- Use JSON format consistently
|
|
84
|
+
- Maintain consistent field names across services
|
|
85
|
+
- Simplify to two log levels: `info` and `error`
|
|
86
|
+
- Never log unstructured strings
|
|
87
|
+
|
|
88
|
+
## Anti-Patterns to Avoid
|
|
89
|
+
|
|
90
|
+
1. **Scattered logs**: Multiple console.log() calls per request
|
|
91
|
+
2. **Multiple loggers**: Different logger instances in different files
|
|
92
|
+
3. **Missing environment context**: No commit hash or deployment info
|
|
93
|
+
4. **Missing business context**: Logging technical details without user/business data
|
|
94
|
+
5. **Unstructured strings**: `console.log('something happened')` instead of structured data
|
|
95
|
+
6. **Inconsistent schemas**: Different field names across services
|
|
96
|
+
|
|
97
|
+
## Guidelines
|
|
98
|
+
|
|
99
|
+
### Wide Events (`rules/wide-events.md`)
|
|
100
|
+
- Emit one wide event per service hop
|
|
101
|
+
- Include all relevant context
|
|
102
|
+
- Connect events with request ID
|
|
103
|
+
- Emit at request completion in finally block
|
|
104
|
+
|
|
105
|
+
### Context (`rules/context.md`)
|
|
106
|
+
- Support high cardinality fields (user_id, request_id)
|
|
107
|
+
- Include high dimensionality (many fields)
|
|
108
|
+
- Always include business context
|
|
109
|
+
- Always include environment characteristics (commit_hash, version, region)
|
|
110
|
+
|
|
111
|
+
### Structure (`rules/structure.md`)
|
|
112
|
+
- Use a single logger throughout the codebase
|
|
113
|
+
- Use middleware for consistent wide events
|
|
114
|
+
- Use JSON format
|
|
115
|
+
- Maintain consistent schema
|
|
116
|
+
- Simplify to info and error levels
|
|
117
|
+
- Never log unstructured strings
|
|
118
|
+
|
|
119
|
+
### Common Pitfalls (`rules/pitfalls.md`)
|
|
120
|
+
- Avoid multiple log lines per request
|
|
121
|
+
- Design for unknown unknowns
|
|
122
|
+
- Always propagate request IDs across services
|
|
123
|
+
|
|
124
|
+
References:
|
|
125
|
+
- [Logging Sucks](https://loggingsucks.com)
|
|
126
|
+
- [Observability Wide Events 101](https://boristane.com/blog/observability-wide-events-101/)
|
|
127
|
+
- [Stripe - Canonical Log Lines](https://stripe.com/blog/canonical-log-lines)
|
package/dist/templates/claude-config/app/.agents/skills/logging-best-practices/rules/context.md
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Context, Cardinality, and Dimensionality
|
|
3
|
+
impact: CRITICAL
|
|
4
|
+
tags: logging, context, cardinality, dimensionality
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Context, Cardinality, and Dimensionality
|
|
8
|
+
|
|
9
|
+
**Impact: CRITICAL**
|
|
10
|
+
|
|
11
|
+
Wide events must be context-rich with high cardinality and high dimensionality. This enables you to answer questions you haven't anticipated yet - the "unknown unknowns" that traditional logging misses.
|
|
12
|
+
|
|
13
|
+
### High Cardinality
|
|
14
|
+
|
|
15
|
+
High cardinality means a field can have millions or billions of unique values. User IDs, request IDs, and transaction IDs are high cardinality fields. Your logging must support querying against any specific value of these fields. Without high cardinality support, you cannot debug issues for specific users.
|
|
16
|
+
|
|
17
|
+
### High Dimensionality
|
|
18
|
+
|
|
19
|
+
High dimensionality means your events have many fields (20-100+). More dimensions mean more questions you can answer without redeploying code.
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
const wideEvent = {
|
|
23
|
+
// Timing
|
|
24
|
+
timestamp: '2024-09-08T06:14:05.680Z',
|
|
25
|
+
duration_ms: 268,
|
|
26
|
+
|
|
27
|
+
// Request context
|
|
28
|
+
method: 'POST',
|
|
29
|
+
path: '/checkout',
|
|
30
|
+
requestId: 'req_abc123',
|
|
31
|
+
|
|
32
|
+
// Infrastructure
|
|
33
|
+
service: 'checkout-service',
|
|
34
|
+
version: '2.4.1',
|
|
35
|
+
region: 'us-east-1',
|
|
36
|
+
commit_hash: '690de31f',
|
|
37
|
+
|
|
38
|
+
// User context (HIGH CARDINALITY - millions of unique values)
|
|
39
|
+
user: {
|
|
40
|
+
id: 'user_456',
|
|
41
|
+
subscription: 'premium',
|
|
42
|
+
account_age_days: 847,
|
|
43
|
+
lifetime_value_cents: 284700,
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
// Business context
|
|
47
|
+
cart: {
|
|
48
|
+
id: 'cart_xyz',
|
|
49
|
+
item_count: 3,
|
|
50
|
+
total_cents: 15999,
|
|
51
|
+
coupon_applied: 'SAVE20',
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
// Payment details
|
|
55
|
+
payment: {
|
|
56
|
+
method: 'card',
|
|
57
|
+
provider: 'stripe',
|
|
58
|
+
latency_ms: 189,
|
|
59
|
+
},
|
|
60
|
+
|
|
61
|
+
// Feature flags - crucial for debugging rollouts
|
|
62
|
+
feature_flags: {
|
|
63
|
+
new_checkout_flow: true,
|
|
64
|
+
},
|
|
65
|
+
|
|
66
|
+
// Outcome
|
|
67
|
+
status_code: 200,
|
|
68
|
+
outcome: 'success',
|
|
69
|
+
};
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Always Include Business Context
|
|
73
|
+
|
|
74
|
+
Include business-specific context, not just technical details. User subscription tier, cart value, feature flags, account age - this context helps prioritize issues and understand business impact.
|
|
75
|
+
|
|
76
|
+
```typescript
|
|
77
|
+
const wideEvent = {
|
|
78
|
+
requestId: 'req_123',
|
|
79
|
+
method: 'POST',
|
|
80
|
+
path: '/checkout',
|
|
81
|
+
status_code: 500,
|
|
82
|
+
|
|
83
|
+
// Business context that changes response priority
|
|
84
|
+
user: {
|
|
85
|
+
id: 'user_456',
|
|
86
|
+
subscription: 'enterprise', // High-value customer
|
|
87
|
+
account_age_days: 1247, // Long-term customer
|
|
88
|
+
lifetime_value_cents: 4850000, // $48,500 LTV
|
|
89
|
+
},
|
|
90
|
+
|
|
91
|
+
cart: {
|
|
92
|
+
total_cents: 249900, // $2,499 order
|
|
93
|
+
contains_annual_plan: true, // Recurring revenue at stake
|
|
94
|
+
},
|
|
95
|
+
|
|
96
|
+
feature_flags: {
|
|
97
|
+
new_payment_flow: true, // Was new code involved?
|
|
98
|
+
},
|
|
99
|
+
|
|
100
|
+
error: {
|
|
101
|
+
type: 'PaymentError',
|
|
102
|
+
code: 'card_declined',
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
// Now you KNOW this is critical: Enterprise customer, $48.5k LTV,
|
|
106
|
+
// trying to make a $2.5k purchase, and new_payment_flow is enabled
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Business context transforms debugging from "something broke" to "this $48,500 customer can't complete a $2,499 order."
|
|
110
|
+
|
|
111
|
+
### Always Include Environment Characteristics
|
|
112
|
+
|
|
113
|
+
Include environment and deployment information in every wide event. This context is essential for correlating issues with deployments, identifying region-specific problems, and understanding the runtime environment.
|
|
114
|
+
|
|
115
|
+
**Environment fields to include:**
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
const wideEvent = {
|
|
119
|
+
// ... request and business context
|
|
120
|
+
|
|
121
|
+
// Environment characteristics
|
|
122
|
+
env: {
|
|
123
|
+
// Deployment info
|
|
124
|
+
commit_hash: process.env.COMMIT_SHA || process.env.GIT_COMMIT,
|
|
125
|
+
version: process.env.SERVICE_VERSION || process.env.npm_package_version,
|
|
126
|
+
deployment_id: process.env.DEPLOYMENT_ID,
|
|
127
|
+
deploy_time: process.env.DEPLOY_TIMESTAMP,
|
|
128
|
+
|
|
129
|
+
// Infrastructure
|
|
130
|
+
service: process.env.SERVICE_NAME,
|
|
131
|
+
region: process.env.AWS_REGION || process.env.REGION,
|
|
132
|
+
availability_zone: process.env.AWS_AVAILABILITY_ZONE,
|
|
133
|
+
instance_id: process.env.INSTANCE_ID || process.env.HOSTNAME,
|
|
134
|
+
container_id: process.env.CONTAINER_ID,
|
|
135
|
+
|
|
136
|
+
// Runtime
|
|
137
|
+
node_version: process.version,
|
|
138
|
+
runtime: process.env.AWS_EXECUTION_ENV || 'node',
|
|
139
|
+
memory_limit_mb: process.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE,
|
|
140
|
+
|
|
141
|
+
// Environment type
|
|
142
|
+
environment: process.env.NODE_ENV || process.env.ENVIRONMENT,
|
|
143
|
+
stage: process.env.STAGE,
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
**Why environment context matters:**
|
|
149
|
+
|
|
150
|
+
- **commit_hash**: Instantly identify which code version caused an issue
|
|
151
|
+
- **deployment_id**: Correlate errors with specific deployments
|
|
152
|
+
- **region/availability_zone**: Identify region-specific failures
|
|
153
|
+
- **instance_id**: Debug issues affecting specific instances
|
|
154
|
+
- **version**: Track issues across service versions
|
|
155
|
+
- **environment**: Distinguish production from staging issues
|
|
156
|
+
|
|
157
|
+
This environment context should be added once at service startup and automatically included in every wide event via middleware.
|
package/dist/templates/claude-config/app/.agents/skills/logging-best-practices/rules/pitfalls.md
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Common Pitfalls
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
tags: logging, anti-patterns, pitfalls
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Common Pitfalls
|
|
8
|
+
|
|
9
|
+
**Impact: MEDIUM**
|
|
10
|
+
|
|
11
|
+
Avoid these anti-patterns that undermine your logging effectiveness.
|
|
12
|
+
|
|
13
|
+
### Pitfall 1: Too Many Log Lines Per Request
|
|
14
|
+
|
|
15
|
+
Emitting multiple log lines per request creates noise without value. These scattered logs cannot be efficiently queried.
|
|
16
|
+
|
|
17
|
+
**Incorrect:**
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
app.post('/checkout', async (c) => {
|
|
21
|
+
console.log('Received checkout request'); // Line 1
|
|
22
|
+
console.log(`User ID: ${c.get('userId')}`); // Line 2
|
|
23
|
+
const user = await getUser(c.get('userId'));
|
|
24
|
+
console.log(`User fetched: ${user.email}`); // Line 3
|
|
25
|
+
const cart = await getCart(user.id);
|
|
26
|
+
console.log(`Cart fetched: ${cart.items.length} items`); // Line 4
|
|
27
|
+
const payment = await processPayment(cart);
|
|
28
|
+
console.log(`Payment processed: ${payment.status}`); // Line 5
|
|
29
|
+
console.log('Checkout completed successfully'); // Line 6
|
|
30
|
+
return c.json({ orderId: payment.orderId });
|
|
31
|
+
});
|
|
32
|
+
// 6 log lines per request = noise
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**Correct:**
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
// Single wide event with everything
|
|
39
|
+
const wideEvent = {
|
|
40
|
+
method: 'POST',
|
|
41
|
+
path: '/checkout',
|
|
42
|
+
user: { id: user.id, email: user.email },
|
|
43
|
+
cart: { item_count: cart.items.length, total: cart.total },
|
|
44
|
+
payment: { status: payment.status, order_id: payment.orderId },
|
|
45
|
+
status_code: 200,
|
|
46
|
+
duration_ms: 1247,
|
|
47
|
+
};
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Pitfall 2: Not Designing for Unknown Unknowns
|
|
51
|
+
|
|
52
|
+
Traditional logging captures "known unknowns" - issues you anticipated. But production bugs are often "unknown unknowns" - issues you never predicted. Wide events with rich context enable investigating issues you didn't anticipate.
|
|
53
|
+
|
|
54
|
+
**Incorrect:**
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
// Logging only for anticipated issues
|
|
58
|
+
app.post('/articles', async (c) => {
|
|
59
|
+
const article = await createArticle(c.req.body, user);
|
|
60
|
+
if (!article.published) {
|
|
61
|
+
console.log('Article created but not published'); // Anticipated issue
|
|
62
|
+
}
|
|
63
|
+
return c.json({ article });
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// Bug: "Users on free trial can't see their articles"
|
|
67
|
+
// Your logs say: "Article created successfully" ✓
|
|
68
|
+
// But you have NO visibility into:
|
|
69
|
+
// - Which users are affected (free trial? all?)
|
|
70
|
+
// - What subscription plans see this issue
|
|
71
|
+
// - When it started
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Correct:**
|
|
75
|
+
|
|
76
|
+
```typescript
|
|
77
|
+
// Wide event captures everything
|
|
78
|
+
wideEvent.user = {
|
|
79
|
+
id: user.id,
|
|
80
|
+
subscription: user.subscription,
|
|
81
|
+
trial: user.trial,
|
|
82
|
+
trial_expiration: user.trialExpiration,
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
wideEvent.article = {
|
|
86
|
+
id: article.id,
|
|
87
|
+
published: article.published, // Captured even though we didn't anticipate the bug
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
// Now you can query: WHERE article.published = false GROUP BY user.trial
|
|
91
|
+
// Result: 95% of unpublished articles are from trial users!
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Pitfall 3: Missing Request Correlation
|
|
95
|
+
|
|
96
|
+
Without request IDs propagated across services, you cannot trace a request's journey.
|
|
97
|
+
|
|
98
|
+
**Incorrect:**
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
// Service A logs
|
|
102
|
+
{ message: 'Order created', order_id: 'ord_123' }
|
|
103
|
+
|
|
104
|
+
// Service B logs
|
|
105
|
+
{ message: 'Inventory reserved', items: 3 }
|
|
106
|
+
|
|
107
|
+
// No way to connect these two events!
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**Correct:**
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
// Both services include the same request_id
|
|
114
|
+
{ request_id: 'req_abc', message: 'Order created', order_id: 'ord_123' }
|
|
115
|
+
{ request_id: 'req_abc', message: 'Inventory reserved', items: 3 }
|
|
116
|
+
|
|
117
|
+
// Query: WHERE request_id = 'req_abc' shows the full flow
|
|
118
|
+
```
|
package/dist/templates/claude-config/app/.agents/skills/logging-best-practices/rules/structure.md
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Structure and Format
|
|
3
|
+
impact: HIGH
|
|
4
|
+
tags: logging, json, structured-logging, schema, middleware
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Structure and Format
|
|
8
|
+
|
|
9
|
+
**Impact: HIGH**
|
|
10
|
+
|
|
11
|
+
Structured logging with consistent formats enables efficient querying and analysis. The right structure transforms logs from text files into queryable data.
|
|
12
|
+
|
|
13
|
+
### Use a Single Logger Throughout the Codebase
|
|
14
|
+
|
|
15
|
+
Use one logger instance configured at application startup and import it everywhere. This ensures consistent formatting, log levels, and output destinations across all modules.
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
// lib/logger.ts - Single logger configuration
|
|
19
|
+
import pino from 'pino';
|
|
20
|
+
|
|
21
|
+
// Configure once at startup
|
|
22
|
+
export const logger = pino({
|
|
23
|
+
level: process.env.LOG_LEVEL || 'info',
|
|
24
|
+
formatters: {
|
|
25
|
+
level: (label) => ({ level: label }),
|
|
26
|
+
},
|
|
27
|
+
base: {
|
|
28
|
+
// Environment context added to ALL logs automatically
|
|
29
|
+
service: process.env.SERVICE_NAME,
|
|
30
|
+
version: process.env.SERVICE_VERSION,
|
|
31
|
+
commit_hash: process.env.COMMIT_SHA,
|
|
32
|
+
region: process.env.AWS_REGION,
|
|
33
|
+
environment: process.env.NODE_ENV,
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
// Usage everywhere else - just import
|
|
38
|
+
// services/checkout.ts
|
|
39
|
+
import { logger } from '../lib/logger';
|
|
40
|
+
|
|
41
|
+
logger.info({ event: 'checkout_completed', orderId });
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**Benefits:**
|
|
45
|
+
- Consistent log format across all modules
|
|
46
|
+
- Environment context automatically included
|
|
47
|
+
- Single place to change log level or destination
|
|
48
|
+
- No risk of misconfigured loggers in different files
|
|
49
|
+
|
|
50
|
+
**Avoid:**
|
|
51
|
+
```typescript
|
|
52
|
+
// DON'T create new loggers in each file
|
|
53
|
+
const logger = new Logger(); // Each file creates its own
|
|
54
|
+
console.log('some event'); // Bypasses the logger entirely
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Use Middleware for Consistent Wide Events
|
|
58
|
+
|
|
59
|
+
Implement wide event collection as middleware that wraps all request handlers. The middleware initializes the event, captures timing, handles emission in the finally block, and makes the event accessible to handlers for enrichment.
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
// middleware/wideEvent.ts
|
|
63
|
+
import { logger } from '../lib/logger';
|
|
64
|
+
|
|
65
|
+
// Capture environment once at startup
|
|
66
|
+
const envContext = {
|
|
67
|
+
service: process.env.SERVICE_NAME,
|
|
68
|
+
version: process.env.SERVICE_VERSION,
|
|
69
|
+
commit_hash: process.env.COMMIT_SHA,
|
|
70
|
+
region: process.env.AWS_REGION,
|
|
71
|
+
environment: process.env.NODE_ENV,
|
|
72
|
+
instance_id: process.env.HOSTNAME,
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
export function wideEventMiddleware() {
|
|
76
|
+
return async (c: Context, next: Next) => {
|
|
77
|
+
const startTime = Date.now();
|
|
78
|
+
|
|
79
|
+
// Initialize event with standard fields + environment
|
|
80
|
+
const wideEvent: Record<string, unknown> = {
|
|
81
|
+
request_id: c.get('requestId') || crypto.randomUUID(),
|
|
82
|
+
timestamp: new Date().toISOString(),
|
|
83
|
+
method: c.req.method,
|
|
84
|
+
path: c.req.path,
|
|
85
|
+
user_agent: c.req.header('user-agent'),
|
|
86
|
+
...envContext, // Environment automatically included
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
// Make event accessible to handlers for enrichment
|
|
90
|
+
c.set('wideEvent', wideEvent);
|
|
91
|
+
|
|
92
|
+
try {
|
|
93
|
+
await next();
|
|
94
|
+
wideEvent.status_code = c.res.status;
|
|
95
|
+
wideEvent.outcome = c.res.status < 400 ? 'success' : 'error';
|
|
96
|
+
} catch (error) {
|
|
97
|
+
wideEvent.status_code = 500;
|
|
98
|
+
wideEvent.outcome = 'error';
|
|
99
|
+
wideEvent.error = {
|
|
100
|
+
type: error.name,
|
|
101
|
+
message: error.message,
|
|
102
|
+
};
|
|
103
|
+
throw error;
|
|
104
|
+
} finally {
|
|
105
|
+
wideEvent.duration_ms = Date.now() - startTime;
|
|
106
|
+
logger.info(wideEvent); // Uses the single logger
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Apply middleware globally
|
|
112
|
+
app.use('*', wideEventMiddleware());
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
**Handlers just enrich with business context:**
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
app.post('/checkout', async (c) => {
|
|
119
|
+
const wideEvent = c.get('wideEvent');
|
|
120
|
+
const user = c.get('user');
|
|
121
|
+
|
|
122
|
+
// Add business context - environment already included by middleware
|
|
123
|
+
wideEvent.user = { id: user.id, subscription: user.subscription };
|
|
124
|
+
|
|
125
|
+
const cart = await getCart(user.id);
|
|
126
|
+
wideEvent.cart = { id: cart.id, total: cart.total };
|
|
127
|
+
|
|
128
|
+
const order = await createOrder(cart);
|
|
129
|
+
wideEvent.order = { id: order.id };
|
|
130
|
+
|
|
131
|
+
return c.json(order, 201);
|
|
132
|
+
});
|
|
133
|
+
// Middleware handles: timing, status, environment, emission
|
|
134
|
+
// Handler handles: business context only
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Use JSON Format
|
|
138
|
+
|
|
139
|
+
Use JSON as your logging format. JSON is universally supported, enables nested objects for complex context, works across all programming languages, and is easily parsed.
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
const wideEvent = {
|
|
143
|
+
timestamp: '2024-09-08T06:14:05.680Z',
|
|
144
|
+
service: 'articles',
|
|
145
|
+
requestId: 'req_abc123',
|
|
146
|
+
message: 'Article created',
|
|
147
|
+
user: { id: 'user_123', subscription: 'premium' },
|
|
148
|
+
article: { id: 'article_456', title: 'My Post' },
|
|
149
|
+
duration_ms: 268,
|
|
150
|
+
status_code: 201,
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
// Emit as single-line JSON
|
|
154
|
+
logger.info(wideEvent);
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Maintain Consistent Schema
|
|
158
|
+
|
|
159
|
+
Use consistent field names across all services. If one service uses `user_id` and another uses `userId`, querying becomes painful.
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
// All services use the same schema
|
|
163
|
+
{
|
|
164
|
+
request_id: 'req_abc',
|
|
165
|
+
user: { id: 'user_123' },
|
|
166
|
+
duration_ms: 268,
|
|
167
|
+
status_code: 200,
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Define your schema once and share it across services via a common library or documented standard.
|
|
172
|
+
|
|
173
|
+
### Simplify Log Levels
|
|
174
|
+
|
|
175
|
+
Limit yourself to two log levels: `info` and `error`. The distinction between debug, trace, warn, info, notice, and critical creates confusion without adding value.
|
|
176
|
+
|
|
177
|
+
- **INFO**: Normal operations, all wide events
|
|
178
|
+
- **ERROR**: Unexpected failures that need attention
|
|
179
|
+
|
|
180
|
+
If you find yourself wanting debug logs, add that context to your wide event instead.
|
|
181
|
+
|
|
182
|
+
### Never Log Unstructured Strings
|
|
183
|
+
|
|
184
|
+
Every log must be structured with queryable fields. `console.log('User logged in')` is useless for debugging at scale.
|
|
185
|
+
|
|
186
|
+
```typescript
|
|
187
|
+
// Add the data to your wide event instead
|
|
188
|
+
wideEvent.order = { id: orderId, status: 'created' };
|
|
189
|
+
wideEvent.payment = { error: { message: error.message } };
|
|
190
|
+
// Now it's queryable: WHERE order.status = 'created'
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
If you're tempted to write `console.log('something happened')`, ask: "What fields would make this queryable?" Then add those fields to your wide event instead.
|