create-xani-agentic-app 1.0.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 +237 -0
- package/index.js +219 -0
- package/package.json +46 -0
- package/template/.agents/skills/ai-sdk/SKILL.md +78 -0
- package/template/.agents/skills/ai-sdk/references/ai-gateway.md +66 -0
- package/template/.agents/skills/ai-sdk/references/common-errors.md +443 -0
- package/template/.agents/skills/ai-sdk/references/devtools.md +52 -0
- package/template/.agents/skills/ai-sdk/references/type-safe-agents.md +204 -0
- package/template/.agents/skills/better-auth-best-practices/SKILL.md +175 -0
- package/template/.agents/skills/checkpoint/SKILL.md +82 -0
- package/template/.agents/skills/create-spec/SKILL.md +132 -0
- package/template/.agents/skills/create-spec/references/action-required-template.md +53 -0
- package/template/.agents/skills/create-spec/references/readme-template.md +53 -0
- package/template/.agents/skills/create-spec/references/requirements-template.md +54 -0
- package/template/.agents/skills/create-spec/references/task-template.md +79 -0
- package/template/.agents/skills/find-skills/SKILL.md +142 -0
- package/template/.agents/skills/frontend-design/LICENSE.txt +177 -0
- package/template/.agents/skills/frontend-design/SKILL.md +42 -0
- package/template/.agents/skills/implement-feature/SKILL.md +189 -0
- package/template/.agents/skills/implement-feature/references/coder-prompt-template.md +46 -0
- package/template/.agents/skills/implement-feature/references/fix-prompt-template.md +38 -0
- package/template/.agents/skills/implement-feature/references/review-prompt-template.md +50 -0
- package/template/.agents/skills/mcp-builder/LICENSE.txt +202 -0
- package/template/.agents/skills/mcp-builder/SKILL.md +236 -0
- package/template/.agents/skills/mcp-builder/reference/evaluation.md +602 -0
- package/template/.agents/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
- package/template/.agents/skills/mcp-builder/reference/node_mcp_server.md +970 -0
- package/template/.agents/skills/mcp-builder/reference/python_mcp_server.md +719 -0
- package/template/.agents/skills/mcp-builder/scripts/connections.py +151 -0
- package/template/.agents/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/template/.agents/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/template/.agents/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/template/.agents/skills/nextjs/SKILL.md +434 -0
- package/template/.agents/skills/nextjs/overlay.yaml +284 -0
- package/template/.agents/skills/nextjs/references/app-router-files.md +94 -0
- package/template/.agents/skills/nextjs/references/async-patterns.md +87 -0
- package/template/.agents/skills/nextjs/references/bundling.md +180 -0
- package/template/.agents/skills/nextjs/references/data-patterns.md +297 -0
- package/template/.agents/skills/nextjs/references/debug-tricks.md +105 -0
- package/template/.agents/skills/nextjs/references/directives.md +73 -0
- package/template/.agents/skills/nextjs/references/error-handling.md +227 -0
- package/template/.agents/skills/nextjs/references/file-conventions.md +140 -0
- package/template/.agents/skills/nextjs/references/font.md +245 -0
- package/template/.agents/skills/nextjs/references/functions.md +108 -0
- package/template/.agents/skills/nextjs/references/hydration-error.md +91 -0
- package/template/.agents/skills/nextjs/references/image.md +173 -0
- package/template/.agents/skills/nextjs/references/metadata.md +301 -0
- package/template/.agents/skills/nextjs/references/parallel-routes.md +287 -0
- package/template/.agents/skills/nextjs/references/route-handlers.md +146 -0
- package/template/.agents/skills/nextjs/references/rsc-boundaries.md +159 -0
- package/template/.agents/skills/nextjs/references/runtime-selection.md +39 -0
- package/template/.agents/skills/nextjs/references/scripts.md +141 -0
- package/template/.agents/skills/nextjs/references/self-hosting.md +371 -0
- package/template/.agents/skills/nextjs/references/suspense-boundaries.md +67 -0
- package/template/.agents/skills/nextjs/upstream/SKILL.md +153 -0
- package/template/.agents/skills/nextjs/upstream/references/app-router-files.md +94 -0
- package/template/.agents/skills/nextjs/upstream/references/async-patterns.md +87 -0
- package/template/.agents/skills/nextjs/upstream/references/bundling.md +180 -0
- package/template/.agents/skills/nextjs/upstream/references/data-patterns.md +297 -0
- package/template/.agents/skills/nextjs/upstream/references/debug-tricks.md +105 -0
- package/template/.agents/skills/nextjs/upstream/references/directives.md +73 -0
- package/template/.agents/skills/nextjs/upstream/references/error-handling.md +227 -0
- package/template/.agents/skills/nextjs/upstream/references/file-conventions.md +140 -0
- package/template/.agents/skills/nextjs/upstream/references/font.md +245 -0
- package/template/.agents/skills/nextjs/upstream/references/functions.md +108 -0
- package/template/.agents/skills/nextjs/upstream/references/hydration-error.md +91 -0
- package/template/.agents/skills/nextjs/upstream/references/image.md +173 -0
- package/template/.agents/skills/nextjs/upstream/references/metadata.md +301 -0
- package/template/.agents/skills/nextjs/upstream/references/parallel-routes.md +287 -0
- package/template/.agents/skills/nextjs/upstream/references/route-handlers.md +146 -0
- package/template/.agents/skills/nextjs/upstream/references/rsc-boundaries.md +159 -0
- package/template/.agents/skills/nextjs/upstream/references/runtime-selection.md +39 -0
- package/template/.agents/skills/nextjs/upstream/references/scripts.md +141 -0
- package/template/.agents/skills/nextjs/upstream/references/self-hosting.md +371 -0
- package/template/.agents/skills/nextjs/upstream/references/suspense-boundaries.md +67 -0
- package/template/.agents/skills/playwright-cli/SKILL.md +344 -0
- package/template/.agents/skills/playwright-cli/references/element-attributes.md +23 -0
- package/template/.agents/skills/playwright-cli/references/playwright-tests.md +39 -0
- package/template/.agents/skills/playwright-cli/references/request-mocking.md +87 -0
- package/template/.agents/skills/playwright-cli/references/running-code.md +231 -0
- package/template/.agents/skills/playwright-cli/references/session-management.md +169 -0
- package/template/.agents/skills/playwright-cli/references/storage-state.md +275 -0
- package/template/.agents/skills/playwright-cli/references/test-generation.md +88 -0
- package/template/.agents/skills/playwright-cli/references/tracing.md +139 -0
- package/template/.agents/skills/playwright-cli/references/video-recording.md +143 -0
- package/template/.agents/skills/review-pr/SKILL.md +97 -0
- package/template/.agents/skills/security-scanner/SKILL.md +157 -0
- package/template/.agents/skills/security-scanner/references/A01-broken-access-control.md +136 -0
- package/template/.agents/skills/security-scanner/references/A02-security-misconfiguration.md +130 -0
- package/template/.agents/skills/security-scanner/references/A03-software-supply-chain-failures.md +117 -0
- package/template/.agents/skills/security-scanner/references/A04-cryptographic-failures.md +141 -0
- package/template/.agents/skills/security-scanner/references/A05-injection.md +155 -0
- package/template/.agents/skills/security-scanner/references/A06-insecure-design.md +145 -0
- package/template/.agents/skills/security-scanner/references/A07-authentication-failures.md +150 -0
- package/template/.agents/skills/security-scanner/references/A08-software-data-integrity-failures.md +132 -0
- package/template/.agents/skills/security-scanner/references/A09-security-logging-alerting-failures.md +130 -0
- package/template/.agents/skills/security-scanner/references/A10-mishandling-exceptional-conditions.md +154 -0
- package/template/.agents/skills/security-scanner/references/report-template.md +148 -0
- package/template/.agents/skills/shadcn/SKILL.md +246 -0
- package/template/.agents/skills/shadcn/agents/openai.yml +5 -0
- package/template/.agents/skills/shadcn/assets/shadcn-small.png +0 -0
- package/template/.agents/skills/shadcn/assets/shadcn.png +0 -0
- package/template/.agents/skills/shadcn/cli.md +276 -0
- package/template/.agents/skills/shadcn/customization.md +209 -0
- package/template/.agents/skills/shadcn/evals/evals.json +47 -0
- package/template/.agents/skills/shadcn/mcp.md +94 -0
- package/template/.agents/skills/shadcn/rules/base-vs-radix.md +306 -0
- package/template/.agents/skills/shadcn/rules/composition.md +195 -0
- package/template/.agents/skills/shadcn/rules/forms.md +192 -0
- package/template/.agents/skills/shadcn/rules/icons.md +101 -0
- package/template/.agents/skills/shadcn/rules/styling.md +162 -0
- package/template/.agents/skills/ship-it/SKILL.md +174 -0
- package/template/.agents/skills/skill-creator/LICENSE.txt +202 -0
- package/template/.agents/skills/skill-creator/SKILL.md +485 -0
- package/template/.agents/skills/skill-creator/agents/analyzer.md +274 -0
- package/template/.agents/skills/skill-creator/agents/comparator.md +202 -0
- package/template/.agents/skills/skill-creator/agents/grader.md +223 -0
- package/template/.agents/skills/skill-creator/assets/eval_review.html +146 -0
- package/template/.agents/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/template/.agents/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/template/.agents/skills/skill-creator/references/schemas.md +430 -0
- package/template/.agents/skills/skill-creator/scripts/__init__.py +0 -0
- package/template/.agents/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/template/.agents/skills/skill-creator/scripts/generate_report.py +326 -0
- package/template/.agents/skills/skill-creator/scripts/improve_description.py +247 -0
- package/template/.agents/skills/skill-creator/scripts/package_skill.py +136 -0
- package/template/.agents/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/template/.agents/skills/skill-creator/scripts/run_eval.py +310 -0
- package/template/.agents/skills/skill-creator/scripts/run_loop.py +328 -0
- package/template/.agents/skills/skill-creator/scripts/utils.py +47 -0
- package/template/.agents/skills/vercel-react-best-practices/AGENTS.md +3750 -0
- package/template/.agents/skills/vercel-react-best-practices/README.md +123 -0
- package/template/.agents/skills/vercel-react-best-practices/SKILL.md +148 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/_sections.md +46 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/_template.md +28 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/advanced-effect-event-deps.md +56 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/async-defer-await.md +82 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +60 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/js-flatmap-filter.md +60 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/js-request-idle-callback.md +105 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rendering-resource-hints.md +85 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +68 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +82 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md +59 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/server-hoist-static-io.md +149 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/server-no-shared-module-state.md +50 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/server-parallel-nested-fetching.md +34 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
- package/template/.agents/skills/web-design-guidelines/SKILL.md +39 -0
- package/template/.claude/agents/better-auth-expert.md +189 -0
- package/template/.claude/agents/code-review.md +147 -0
- package/template/.claude/agents/coder.md +139 -0
- package/template/.claude/agents/deep-dive.md +133 -0
- package/template/.claude/agents/polar-payments-expert.md +140 -0
- package/template/.claude/agents/security-scanner.md +214 -0
- package/template/.claude/settings.local.json +15 -0
- package/template/.claude/skills/ai-sdk/SKILL.md +78 -0
- package/template/.claude/skills/ai-sdk/references/ai-gateway.md +66 -0
- package/template/.claude/skills/ai-sdk/references/common-errors.md +443 -0
- package/template/.claude/skills/ai-sdk/references/devtools.md +52 -0
- package/template/.claude/skills/ai-sdk/references/type-safe-agents.md +204 -0
- package/template/.claude/skills/better-auth-best-practices/SKILL.md +175 -0
- package/template/.claude/skills/caveman/SKILL.md +49 -0
- package/template/.claude/skills/checkpoint/SKILL.md +82 -0
- package/template/.claude/skills/create-spec/SKILL.md +132 -0
- package/template/.claude/skills/create-spec/references/action-required-template.md +53 -0
- package/template/.claude/skills/create-spec/references/readme-template.md +53 -0
- package/template/.claude/skills/create-spec/references/requirements-template.md +54 -0
- package/template/.claude/skills/create-spec/references/task-template.md +79 -0
- package/template/.claude/skills/d3-visualization/SKILL.md +62 -0
- package/template/.claude/skills/find-skills/SKILL.md +142 -0
- package/template/.claude/skills/frontend-design/LICENSE.txt +177 -0
- package/template/.claude/skills/frontend-design/SKILL.md +42 -0
- package/template/.claude/skills/grill-me/SKILL.md +10 -0
- package/template/.claude/skills/grill-with-docs/ADR-FORMAT.md +47 -0
- package/template/.claude/skills/grill-with-docs/CONTEXT-FORMAT.md +63 -0
- package/template/.claude/skills/grill-with-docs/SKILL.md +88 -0
- package/template/.claude/skills/gsap-core/SKILL.md +267 -0
- package/template/.claude/skills/implement-feature/SKILL.md +189 -0
- package/template/.claude/skills/implement-feature/references/coder-prompt-template.md +46 -0
- package/template/.claude/skills/implement-feature/references/fix-prompt-template.md +38 -0
- package/template/.claude/skills/implement-feature/references/review-prompt-template.md +50 -0
- package/template/.claude/skills/mcp-builder/LICENSE.txt +202 -0
- package/template/.claude/skills/mcp-builder/SKILL.md +236 -0
- package/template/.claude/skills/mcp-builder/reference/evaluation.md +602 -0
- package/template/.claude/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
- package/template/.claude/skills/mcp-builder/reference/node_mcp_server.md +970 -0
- package/template/.claude/skills/mcp-builder/reference/python_mcp_server.md +719 -0
- package/template/.claude/skills/mcp-builder/scripts/connections.py +151 -0
- package/template/.claude/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/template/.claude/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/template/.claude/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/template/.claude/skills/nextjs/SKILL.md +434 -0
- package/template/.claude/skills/nextjs/overlay.yaml +284 -0
- package/template/.claude/skills/nextjs/references/app-router-files.md +94 -0
- package/template/.claude/skills/nextjs/references/async-patterns.md +87 -0
- package/template/.claude/skills/nextjs/references/bundling.md +180 -0
- package/template/.claude/skills/nextjs/references/data-patterns.md +297 -0
- package/template/.claude/skills/nextjs/references/debug-tricks.md +105 -0
- package/template/.claude/skills/nextjs/references/directives.md +73 -0
- package/template/.claude/skills/nextjs/references/error-handling.md +227 -0
- package/template/.claude/skills/nextjs/references/file-conventions.md +140 -0
- package/template/.claude/skills/nextjs/references/font.md +245 -0
- package/template/.claude/skills/nextjs/references/functions.md +108 -0
- package/template/.claude/skills/nextjs/references/hydration-error.md +91 -0
- package/template/.claude/skills/nextjs/references/image.md +173 -0
- package/template/.claude/skills/nextjs/references/metadata.md +301 -0
- package/template/.claude/skills/nextjs/references/parallel-routes.md +287 -0
- package/template/.claude/skills/nextjs/references/route-handlers.md +146 -0
- package/template/.claude/skills/nextjs/references/rsc-boundaries.md +159 -0
- package/template/.claude/skills/nextjs/references/runtime-selection.md +39 -0
- package/template/.claude/skills/nextjs/references/scripts.md +141 -0
- package/template/.claude/skills/nextjs/references/self-hosting.md +371 -0
- package/template/.claude/skills/nextjs/references/suspense-boundaries.md +67 -0
- package/template/.claude/skills/nextjs/upstream/SKILL.md +153 -0
- package/template/.claude/skills/nextjs/upstream/references/app-router-files.md +94 -0
- package/template/.claude/skills/nextjs/upstream/references/async-patterns.md +87 -0
- package/template/.claude/skills/nextjs/upstream/references/bundling.md +180 -0
- package/template/.claude/skills/nextjs/upstream/references/data-patterns.md +297 -0
- package/template/.claude/skills/nextjs/upstream/references/debug-tricks.md +105 -0
- package/template/.claude/skills/nextjs/upstream/references/directives.md +73 -0
- package/template/.claude/skills/nextjs/upstream/references/error-handling.md +227 -0
- package/template/.claude/skills/nextjs/upstream/references/file-conventions.md +140 -0
- package/template/.claude/skills/nextjs/upstream/references/font.md +245 -0
- package/template/.claude/skills/nextjs/upstream/references/functions.md +108 -0
- package/template/.claude/skills/nextjs/upstream/references/hydration-error.md +91 -0
- package/template/.claude/skills/nextjs/upstream/references/image.md +173 -0
- package/template/.claude/skills/nextjs/upstream/references/metadata.md +301 -0
- package/template/.claude/skills/nextjs/upstream/references/parallel-routes.md +287 -0
- package/template/.claude/skills/nextjs/upstream/references/route-handlers.md +146 -0
- package/template/.claude/skills/nextjs/upstream/references/rsc-boundaries.md +159 -0
- package/template/.claude/skills/nextjs/upstream/references/runtime-selection.md +39 -0
- package/template/.claude/skills/nextjs/upstream/references/scripts.md +141 -0
- package/template/.claude/skills/nextjs/upstream/references/self-hosting.md +371 -0
- package/template/.claude/skills/nextjs/upstream/references/suspense-boundaries.md +67 -0
- package/template/.claude/skills/playwright-cli/SKILL.md +344 -0
- package/template/.claude/skills/playwright-cli/references/element-attributes.md +23 -0
- package/template/.claude/skills/playwright-cli/references/playwright-tests.md +39 -0
- package/template/.claude/skills/playwright-cli/references/request-mocking.md +87 -0
- package/template/.claude/skills/playwright-cli/references/running-code.md +231 -0
- package/template/.claude/skills/playwright-cli/references/session-management.md +169 -0
- package/template/.claude/skills/playwright-cli/references/storage-state.md +275 -0
- package/template/.claude/skills/playwright-cli/references/test-generation.md +88 -0
- package/template/.claude/skills/playwright-cli/references/tracing.md +139 -0
- package/template/.claude/skills/playwright-cli/references/video-recording.md +143 -0
- package/template/.claude/skills/react-three-fiber/SKILL.md +180 -0
- package/template/.claude/skills/remotion/SKILL.md +43 -0
- package/template/.claude/skills/review-pr/SKILL.md +97 -0
- package/template/.claude/skills/security-scanner/SKILL.md +157 -0
- package/template/.claude/skills/security-scanner/references/A01-broken-access-control.md +136 -0
- package/template/.claude/skills/security-scanner/references/A02-security-misconfiguration.md +130 -0
- package/template/.claude/skills/security-scanner/references/A03-software-supply-chain-failures.md +117 -0
- package/template/.claude/skills/security-scanner/references/A04-cryptographic-failures.md +141 -0
- package/template/.claude/skills/security-scanner/references/A05-injection.md +155 -0
- package/template/.claude/skills/security-scanner/references/A06-insecure-design.md +145 -0
- package/template/.claude/skills/security-scanner/references/A07-authentication-failures.md +150 -0
- package/template/.claude/skills/security-scanner/references/A08-software-data-integrity-failures.md +132 -0
- package/template/.claude/skills/security-scanner/references/A09-security-logging-alerting-failures.md +130 -0
- package/template/.claude/skills/security-scanner/references/A10-mishandling-exceptional-conditions.md +154 -0
- package/template/.claude/skills/security-scanner/references/report-template.md +148 -0
- package/template/.claude/skills/shadcn/SKILL.md +246 -0
- package/template/.claude/skills/shadcn/agents/openai.yml +5 -0
- package/template/.claude/skills/shadcn/assets/shadcn-small.png +0 -0
- package/template/.claude/skills/shadcn/assets/shadcn.png +0 -0
- package/template/.claude/skills/shadcn/cli.md +276 -0
- package/template/.claude/skills/shadcn/customization.md +209 -0
- package/template/.claude/skills/shadcn/evals/evals.json +47 -0
- package/template/.claude/skills/shadcn/mcp.md +94 -0
- package/template/.claude/skills/shadcn/rules/base-vs-radix.md +306 -0
- package/template/.claude/skills/shadcn/rules/composition.md +195 -0
- package/template/.claude/skills/shadcn/rules/forms.md +192 -0
- package/template/.claude/skills/shadcn/rules/icons.md +101 -0
- package/template/.claude/skills/shadcn/rules/styling.md +162 -0
- package/template/.claude/skills/ship-it/SKILL.md +174 -0
- package/template/.claude/skills/skill-creator/LICENSE.txt +202 -0
- package/template/.claude/skills/skill-creator/SKILL.md +485 -0
- package/template/.claude/skills/skill-creator/agents/analyzer.md +274 -0
- package/template/.claude/skills/skill-creator/agents/comparator.md +202 -0
- package/template/.claude/skills/skill-creator/agents/grader.md +223 -0
- package/template/.claude/skills/skill-creator/assets/eval_review.html +146 -0
- package/template/.claude/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/template/.claude/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/template/.claude/skills/skill-creator/references/schemas.md +430 -0
- package/template/.claude/skills/skill-creator/scripts/__init__.py +0 -0
- package/template/.claude/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/template/.claude/skills/skill-creator/scripts/generate_report.py +326 -0
- package/template/.claude/skills/skill-creator/scripts/improve_description.py +247 -0
- package/template/.claude/skills/skill-creator/scripts/package_skill.py +136 -0
- package/template/.claude/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/template/.claude/skills/skill-creator/scripts/run_eval.py +310 -0
- package/template/.claude/skills/skill-creator/scripts/run_loop.py +328 -0
- package/template/.claude/skills/skill-creator/scripts/utils.py +47 -0
- package/template/.claude/skills/svelte/SKILL.md +284 -0
- package/template/.claude/skills/tdd/SKILL.md +109 -0
- package/template/.claude/skills/tdd/deep-modules.md +33 -0
- package/template/.claude/skills/tdd/interface-design.md +31 -0
- package/template/.claude/skills/tdd/mocking.md +59 -0
- package/template/.claude/skills/tdd/refactoring.md +10 -0
- package/template/.claude/skills/tdd/tests.md +61 -0
- package/template/.claude/skills/threejs/SKILL.md +43 -0
- package/template/.claude/skills/to-issues/SKILL.md +83 -0
- package/template/.claude/skills/to-prd/SKILL.md +76 -0
- package/template/.claude/skills/vercel-react-best-practices/AGENTS.md +3750 -0
- package/template/.claude/skills/vercel-react-best-practices/README.md +123 -0
- package/template/.claude/skills/vercel-react-best-practices/SKILL.md +148 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/_sections.md +46 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/_template.md +28 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/advanced-effect-event-deps.md +56 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/async-defer-await.md +82 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +60 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/js-flatmap-filter.md +60 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/js-request-idle-callback.md +105 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rendering-resource-hints.md +85 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +68 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +82 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md +59 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/server-hoist-static-io.md +149 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/server-no-shared-module-state.md +50 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/server-parallel-nested-fetching.md +34 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
- package/template/.claude/skills/video-downloader/SKILL.md +42 -0
- package/template/.claude/skills/web-design-guidelines/SKILL.md +39 -0
- package/template/.claude/skills/webgpu-threejs-tsl/REFERENCE.md +371 -0
- package/template/.claude/skills/webgpu-threejs-tsl/SKILL.md +93 -0
- package/template/.claude/skills/webgpu-threejs-tsl/docs/compute-shaders.md +578 -0
- package/template/.claude/skills/webgpu-threejs-tsl/docs/core-concepts.md +497 -0
- package/template/.claude/skills/webgpu-threejs-tsl/docs/device-loss.md +359 -0
- package/template/.claude/skills/webgpu-threejs-tsl/docs/limits-and-features.md +133 -0
- package/template/.claude/skills/webgpu-threejs-tsl/docs/materials.md +353 -0
- package/template/.claude/skills/webgpu-threejs-tsl/docs/post-processing.md +515 -0
- package/template/.claude/skills/webgpu-threejs-tsl/docs/wgsl-integration.md +324 -0
- package/template/.claude/skills/webgpu-threejs-tsl/examples/basic-setup.js +87 -0
- package/template/.claude/skills/webgpu-threejs-tsl/examples/custom-material.js +170 -0
- package/template/.claude/skills/webgpu-threejs-tsl/examples/earth-shader.js +292 -0
- package/template/.claude/skills/webgpu-threejs-tsl/examples/particle-system.js +259 -0
- package/template/.claude/skills/webgpu-threejs-tsl/examples/post-processing.js +199 -0
- package/template/.claude/skills/webgpu-threejs-tsl/templates/compute-shader.js +343 -0
- package/template/.claude/skills/webgpu-threejs-tsl/templates/webgpu-project.js +276 -0
- package/template/.claude/skills/zoom-out/SKILL.md +7 -0
- package/template/.mcp.json +5 -0
- package/template/.nvmrc +1 -0
- package/template/.prettierignore +25 -0
- package/template/.prettierrc +11 -0
- package/template/.vscode/settings.json +1 -0
- package/template/.vscode/tasks.json.example +85 -0
- package/template/AGENTS.md +37 -0
- package/template/CLAUDE.md +75 -0
- package/template/CONTEXT.md +29 -0
- package/template/DESIGN.md +451 -0
- package/template/README.md +394 -0
- package/template/_gitignore +48 -0
- package/template/components.json +21 -0
- package/template/docker-compose.yml +9 -0
- package/template/docs/business/starter-prompt.md +94 -0
- package/template/docs/technical/ai/streaming.md +520 -0
- package/template/docs/technical/ai/structured-data.md +409 -0
- package/template/docs/technical/betterauth/polar.md +476 -0
- package/template/docs/technical/react-markdown.md +123 -0
- package/template/drizzle/0000_chilly_the_phantom.sql +50 -0
- package/template/drizzle/0001_last_warpath.sql +5 -0
- package/template/drizzle/meta/0000_snapshot.json +326 -0
- package/template/drizzle/meta/0001_snapshot.json +410 -0
- package/template/drizzle/meta/_journal.json +20 -0
- package/template/drizzle.config.ts +10 -0
- package/template/env.example +26 -0
- package/template/eslint.config.mjs +75 -0
- package/template/next-env.d.ts +6 -0
- package/template/next.config.ts +57 -0
- package/template/package.json +79 -0
- package/template/postcss.config.mjs +5 -0
- package/template/public/file.svg +1 -0
- package/template/public/globe.svg +1 -0
- package/template/public/next.svg +1 -0
- package/template/public/vercel.svg +1 -0
- package/template/public/window.svg +1 -0
- package/template/scripts/setup.ts +277 -0
- package/template/skills-lock.json +61 -0
- package/template/specs/ui-polish-responsive/README.md +59 -0
- package/template/specs/ui-polish-responsive/action-required.md +3 -0
- package/template/specs/ui-polish-responsive/requirements.md +53 -0
- package/template/specs/ui-polish-responsive/tasks/task-01-globals-css.md +144 -0
- package/template/specs/ui-polish-responsive/tasks/task-02-layout.md +66 -0
- package/template/specs/ui-polish-responsive/tasks/task-03-site-header.md +79 -0
- package/template/specs/ui-polish-responsive/tasks/task-04-site-footer.md +63 -0
- package/template/specs/ui-polish-responsive/tasks/task-05-home-page.md +215 -0
- package/template/specs/ui-polish-responsive/tasks/task-06-dashboard.md +222 -0
- package/template/specs/ui-polish-responsive/tasks/task-07-chat-page.md +225 -0
- package/template/specs/ui-polish-responsive/tasks/task-08-profile-page.md +192 -0
- package/template/specs/ui-polish-responsive/tasks/task-09-auth-pages.md +97 -0
- package/template/specs/ui-polish-responsive/tasks/task-10-setup-checklist.md +120 -0
- package/template/specs/ui-polish-responsive/tasks/task-11-starter-prompt-modal.md +87 -0
- package/template/src/app/(auth)/forgot-password/page.tsx +35 -0
- package/template/src/app/(auth)/layout.tsx +7 -0
- package/template/src/app/(auth)/login/page.tsx +44 -0
- package/template/src/app/(auth)/register/page.tsx +33 -0
- package/template/src/app/(auth)/reset-password/page.tsx +36 -0
- package/template/src/app/api/auth/[...all]/route.ts +4 -0
- package/template/src/app/api/chat/route.ts +80 -0
- package/template/src/app/api/diagnostics/route.ts +162 -0
- package/template/src/app/chat/error.tsx +46 -0
- package/template/src/app/chat/loading.tsx +42 -0
- package/template/src/app/chat/page.tsx +348 -0
- package/template/src/app/dashboard/loading.tsx +63 -0
- package/template/src/app/dashboard/page.tsx +79 -0
- package/template/src/app/error.tsx +44 -0
- package/template/src/app/favicon.ico +0 -0
- package/template/src/app/globals.css +175 -0
- package/template/src/app/layout.tsx +108 -0
- package/template/src/app/manifest.ts +21 -0
- package/template/src/app/not-found.tsx +28 -0
- package/template/src/app/page.tsx +152 -0
- package/template/src/app/profile/page.tsx +416 -0
- package/template/src/app/robots.ts +16 -0
- package/template/src/app/sitemap.ts +26 -0
- package/template/src/components/auth/forgot-password-form.tsx +83 -0
- package/template/src/components/auth/reset-password-form.tsx +107 -0
- package/template/src/components/auth/sign-in-button.tsx +97 -0
- package/template/src/components/auth/sign-out-button.tsx +31 -0
- package/template/src/components/auth/sign-up-form.tsx +121 -0
- package/template/src/components/auth/user-profile.tsx +91 -0
- package/template/src/components/setup-checklist.tsx +180 -0
- package/template/src/components/site-footer.tsx +24 -0
- package/template/src/components/site-header.tsx +46 -0
- package/template/src/components/starter-prompt-modal.tsx +202 -0
- package/template/src/components/theme-provider.tsx +11 -0
- package/template/src/components/ui/avatar.tsx +52 -0
- package/template/src/components/ui/badge.tsx +35 -0
- package/template/src/components/ui/button.tsx +58 -0
- package/template/src/components/ui/card.tsx +78 -0
- package/template/src/components/ui/dialog.tsx +142 -0
- package/template/src/components/ui/dropdown-menu.tsx +256 -0
- package/template/src/components/ui/github-stars.tsx +53 -0
- package/template/src/components/ui/input.tsx +20 -0
- package/template/src/components/ui/label.tsx +23 -0
- package/template/src/components/ui/mode-toggle.tsx +38 -0
- package/template/src/components/ui/separator.tsx +23 -0
- package/template/src/components/ui/skeleton.tsx +13 -0
- package/template/src/components/ui/sonner.tsx +42 -0
- package/template/src/components/ui/spinner.tsx +21 -0
- package/template/src/components/ui/textarea.tsx +17 -0
- package/template/src/hooks/use-diagnostics.ts +86 -0
- package/template/src/lib/auth-client.ts +16 -0
- package/template/src/lib/auth.ts +25 -0
- package/template/src/lib/db.ts +12 -0
- package/template/src/lib/env.ts +117 -0
- package/template/src/lib/schema.ts +82 -0
- package/template/src/lib/session.ts +48 -0
- package/template/src/lib/storage.ts +225 -0
- package/template/src/lib/utils.ts +6 -0
- package/template/src/proxy.ts +25 -0
- package/template/tsconfig.json +48 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1155 1000"><path d="m577.3 0 577.4 1000H0z" fill="#fff"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.5 2.5h13v10a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1zM0 1h16v11.5a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 0 12.5zm3.75 4.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5M7 4.75a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0m1.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5" fill="#666"/></svg>
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
#!/usr/bin/env npx tsx
|
|
2
|
+
/**
|
|
3
|
+
* Interactive setup wizard for the Xani Agentic Starter Kit.
|
|
4
|
+
* Run with: npx tsx scripts/setup.ts
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { existsSync, copyFileSync, readFileSync } from "fs";
|
|
8
|
+
import { createInterface } from "readline";
|
|
9
|
+
import { execSync } from "child_process";
|
|
10
|
+
import { dirname, join } from "path";
|
|
11
|
+
import { fileURLToPath } from "url";
|
|
12
|
+
|
|
13
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
14
|
+
const __dirname = dirname(__filename);
|
|
15
|
+
const ROOT_DIR = join(__dirname, "..");
|
|
16
|
+
const ENV_EXAMPLE = join(ROOT_DIR, "env.example");
|
|
17
|
+
const ENV_FILE = join(ROOT_DIR, ".env");
|
|
18
|
+
|
|
19
|
+
// ANSI colors
|
|
20
|
+
const colors = {
|
|
21
|
+
reset: "\x1b[0m",
|
|
22
|
+
bright: "\x1b[1m",
|
|
23
|
+
green: "\x1b[32m",
|
|
24
|
+
yellow: "\x1b[33m",
|
|
25
|
+
red: "\x1b[31m",
|
|
26
|
+
cyan: "\x1b[36m",
|
|
27
|
+
dim: "\x1b[2m",
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
function log(message: string, color?: keyof typeof colors) {
|
|
31
|
+
const colorCode = color ? colors[color] : "";
|
|
32
|
+
console.log(`${colorCode}${message}${colors.reset}`);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function header(message: string) {
|
|
36
|
+
console.log();
|
|
37
|
+
log(`${"=".repeat(60)}`, "cyan");
|
|
38
|
+
log(` ${message}`, "bright");
|
|
39
|
+
log(`${"=".repeat(60)}`, "cyan");
|
|
40
|
+
console.log();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function success(message: string) {
|
|
44
|
+
log(`✓ ${message}`, "green");
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function warn(message: string) {
|
|
48
|
+
log(`⚠ ${message}`, "yellow");
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function error(message: string) {
|
|
52
|
+
log(`✗ ${message}`, "red");
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function info(message: string) {
|
|
56
|
+
log(` ${message}`, "dim");
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async function prompt(question: string): Promise<string> {
|
|
60
|
+
const rl = createInterface({
|
|
61
|
+
input: process.stdin,
|
|
62
|
+
output: process.stdout,
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
return new Promise((resolve) => {
|
|
66
|
+
rl.question(`${colors.cyan}? ${colors.reset}${question} `, (answer) => {
|
|
67
|
+
rl.close();
|
|
68
|
+
resolve(answer.trim());
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async function confirm(question: string): Promise<boolean> {
|
|
74
|
+
const answer = await prompt(`${question} (y/n)`);
|
|
75
|
+
return answer.toLowerCase() === "y" || answer.toLowerCase() === "yes";
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function checkNodeVersion(): boolean {
|
|
79
|
+
const requiredMajor = 20;
|
|
80
|
+
const currentVersion = process.version;
|
|
81
|
+
const currentMajor = parseInt(currentVersion.slice(1).split(".")[0] || "0", 10);
|
|
82
|
+
|
|
83
|
+
if (currentMajor >= requiredMajor) {
|
|
84
|
+
success(`Node.js ${currentVersion} detected (requires v${requiredMajor}+)`);
|
|
85
|
+
return true;
|
|
86
|
+
} else {
|
|
87
|
+
error(`Node.js ${currentVersion} detected, but v${requiredMajor}+ is required`);
|
|
88
|
+
info("Please upgrade Node.js: https://nodejs.org/");
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function copyEnvFile(): boolean {
|
|
94
|
+
if (existsSync(ENV_FILE)) {
|
|
95
|
+
warn(".env file already exists");
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (!existsSync(ENV_EXAMPLE)) {
|
|
100
|
+
error("env.example file not found");
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
try {
|
|
105
|
+
copyFileSync(ENV_EXAMPLE, ENV_FILE);
|
|
106
|
+
success("Created .env file from env.example");
|
|
107
|
+
return true;
|
|
108
|
+
} catch (err) {
|
|
109
|
+
error(`Failed to create .env file: ${err}`);
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
interface EnvStatus {
|
|
115
|
+
configured: string[];
|
|
116
|
+
missing: string[];
|
|
117
|
+
optional: string[];
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function checkEnvVariables(): EnvStatus {
|
|
121
|
+
const required = ["POSTGRES_URL", "BETTER_AUTH_SECRET"];
|
|
122
|
+
const optional = [
|
|
123
|
+
"GOOGLE_CLIENT_ID",
|
|
124
|
+
"GOOGLE_CLIENT_SECRET",
|
|
125
|
+
"OPENROUTER_API_KEY",
|
|
126
|
+
"OPENROUTER_MODEL",
|
|
127
|
+
"BLOB_READ_WRITE_TOKEN",
|
|
128
|
+
"NEXT_PUBLIC_APP_URL",
|
|
129
|
+
];
|
|
130
|
+
|
|
131
|
+
const status: EnvStatus = {
|
|
132
|
+
configured: [],
|
|
133
|
+
missing: [],
|
|
134
|
+
optional: [],
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
// Read .env file if it exists
|
|
138
|
+
let envContent = "";
|
|
139
|
+
if (existsSync(ENV_FILE)) {
|
|
140
|
+
envContent = readFileSync(ENV_FILE, "utf-8");
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Parse env file (simple key=value parsing)
|
|
144
|
+
const envVars: Record<string, string> = {};
|
|
145
|
+
envContent.split("\n").forEach((line) => {
|
|
146
|
+
const trimmed = line.trim();
|
|
147
|
+
if (trimmed && !trimmed.startsWith("#")) {
|
|
148
|
+
const [key, ...valueParts] = trimmed.split("=");
|
|
149
|
+
if (key) {
|
|
150
|
+
envVars[key] = valueParts.join("=");
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
// Check required variables
|
|
156
|
+
for (const key of required) {
|
|
157
|
+
const value = envVars[key];
|
|
158
|
+
if (value && value.length > 0 && !value.startsWith("your-")) {
|
|
159
|
+
status.configured.push(key);
|
|
160
|
+
} else {
|
|
161
|
+
status.missing.push(key);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Check optional variables
|
|
166
|
+
for (const key of optional) {
|
|
167
|
+
const value = envVars[key];
|
|
168
|
+
if (value && value.length > 0 && !value.startsWith("your-")) {
|
|
169
|
+
status.configured.push(key);
|
|
170
|
+
} else {
|
|
171
|
+
status.optional.push(key);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return status;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
async function runDatabaseMigration(): Promise<boolean> {
|
|
179
|
+
log("\nRunning database migration...", "cyan");
|
|
180
|
+
|
|
181
|
+
try {
|
|
182
|
+
execSync("pnpm db:migrate", {
|
|
183
|
+
cwd: ROOT_DIR,
|
|
184
|
+
stdio: "inherit",
|
|
185
|
+
});
|
|
186
|
+
success("Database migration completed");
|
|
187
|
+
return true;
|
|
188
|
+
} catch {
|
|
189
|
+
error("Database migration failed");
|
|
190
|
+
info("Make sure your database is running and POSTGRES_URL is correct");
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function printNextSteps(envStatus: EnvStatus) {
|
|
196
|
+
header("Next Steps");
|
|
197
|
+
|
|
198
|
+
const steps: string[] = [];
|
|
199
|
+
|
|
200
|
+
if (envStatus.missing.length > 0) {
|
|
201
|
+
steps.push(`Configure required env vars in .env: ${envStatus.missing.join(", ")}`);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
if (envStatus.optional.includes("GOOGLE_CLIENT_ID")) {
|
|
205
|
+
steps.push("Set up Google OAuth at https://console.cloud.google.com/");
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
if (envStatus.optional.includes("OPENROUTER_API_KEY")) {
|
|
209
|
+
steps.push("Get an OpenRouter API key at https://openrouter.ai/settings/keys");
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
steps.push("Start the development server: pnpm dev");
|
|
213
|
+
steps.push("Open http://localhost:3000 in your browser");
|
|
214
|
+
|
|
215
|
+
steps.forEach((step, index) => {
|
|
216
|
+
log(`${index + 1}. ${step}`);
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
console.log();
|
|
220
|
+
log("Documentation:", "bright");
|
|
221
|
+
info("- README.md - Project overview and setup");
|
|
222
|
+
info("- CLAUDE.md - AI assistant guidelines");
|
|
223
|
+
info("- docs/ - Technical documentation");
|
|
224
|
+
console.log();
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
async function main() {
|
|
228
|
+
header("Xani Agentic Starter Kit - Setup Wizard");
|
|
229
|
+
|
|
230
|
+
// Step 1: Check Node version
|
|
231
|
+
log("Checking Node.js version...", "cyan");
|
|
232
|
+
if (!checkNodeVersion()) {
|
|
233
|
+
process.exit(1);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Step 2: Create .env file
|
|
237
|
+
console.log();
|
|
238
|
+
log("Setting up environment...", "cyan");
|
|
239
|
+
copyEnvFile();
|
|
240
|
+
|
|
241
|
+
// Step 3: Check environment variables
|
|
242
|
+
console.log();
|
|
243
|
+
log("Checking environment variables...", "cyan");
|
|
244
|
+
const envStatus = checkEnvVariables();
|
|
245
|
+
|
|
246
|
+
if (envStatus.configured.length > 0) {
|
|
247
|
+
success(`Configured: ${envStatus.configured.join(", ")}`);
|
|
248
|
+
}
|
|
249
|
+
if (envStatus.missing.length > 0) {
|
|
250
|
+
warn(`Missing (required): ${envStatus.missing.join(", ")}`);
|
|
251
|
+
}
|
|
252
|
+
if (envStatus.optional.length > 0) {
|
|
253
|
+
info(`Optional (not set): ${envStatus.optional.join(", ")}`);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// Step 4: Offer to run database migration
|
|
257
|
+
if (envStatus.missing.length === 0) {
|
|
258
|
+
console.log();
|
|
259
|
+
const shouldMigrate = await confirm("Would you like to run database migrations now?");
|
|
260
|
+
if (shouldMigrate) {
|
|
261
|
+
await runDatabaseMigration();
|
|
262
|
+
}
|
|
263
|
+
} else {
|
|
264
|
+
console.log();
|
|
265
|
+
warn("Skipping database migration - please configure required env vars first");
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// Step 5: Print next steps
|
|
269
|
+
printNextSteps(envStatus);
|
|
270
|
+
|
|
271
|
+
log("Setup complete!", "green");
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
main().catch((err) => {
|
|
275
|
+
error(`Setup failed: ${err}`);
|
|
276
|
+
process.exit(1);
|
|
277
|
+
});
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"skills": {
|
|
4
|
+
"ai-sdk": {
|
|
5
|
+
"source": "vercel/ai",
|
|
6
|
+
"sourceType": "github",
|
|
7
|
+
"skillPath": "skills/use-ai-sdk/SKILL.md",
|
|
8
|
+
"computedHash": "2249889eb47ef0f61c4dba4cf2afe01c1c8dd793bb4c24230347c1ab909bb7dd"
|
|
9
|
+
},
|
|
10
|
+
"better-auth-best-practices": {
|
|
11
|
+
"source": "better-auth/skills",
|
|
12
|
+
"sourceType": "github",
|
|
13
|
+
"computedHash": "9ab075b5061be2a5f299c10505667345cc1ec76e8de4120901cfd586643e776f"
|
|
14
|
+
},
|
|
15
|
+
"find-skills": {
|
|
16
|
+
"source": "vercel-labs/skills",
|
|
17
|
+
"sourceType": "github",
|
|
18
|
+
"computedHash": "9e1c8b3103f92fa8092568a44fe64858de7c5c9dc65ce4bea8f168080e889cfd"
|
|
19
|
+
},
|
|
20
|
+
"frontend-design": {
|
|
21
|
+
"source": "anthropics/skills",
|
|
22
|
+
"sourceType": "github",
|
|
23
|
+
"computedHash": "516bd2154eb843a8240e43d5b285229129853114ad7075a5e141e1c08e408c84"
|
|
24
|
+
},
|
|
25
|
+
"mcp-builder": {
|
|
26
|
+
"source": "anthropics/skills",
|
|
27
|
+
"sourceType": "github",
|
|
28
|
+
"computedHash": "f08cbdec74dba480ec5217363446dae154b7576b8c3d9b4cb17aff234f15973b"
|
|
29
|
+
},
|
|
30
|
+
"nextjs": {
|
|
31
|
+
"source": "vercel-labs/vercel-plugin",
|
|
32
|
+
"sourceType": "github",
|
|
33
|
+
"computedHash": "044a0bc722b018b636c9bd23f3dd4e4410fd8b0815d79b1fa1ba3fa7dc5f4d88"
|
|
34
|
+
},
|
|
35
|
+
"playwright-cli": {
|
|
36
|
+
"source": "microsoft/playwright-cli",
|
|
37
|
+
"sourceType": "github",
|
|
38
|
+
"computedHash": "675811a7e7f958e6544f9c6bc53993c85fe39e72c5820a60d9d46bd169eddc32"
|
|
39
|
+
},
|
|
40
|
+
"shadcn": {
|
|
41
|
+
"source": "shadcn/ui",
|
|
42
|
+
"sourceType": "github",
|
|
43
|
+
"computedHash": "642a177bee320618caa49f5106cadb4e7594c606e867f61ba7b56d19cf745cd5"
|
|
44
|
+
},
|
|
45
|
+
"skill-creator": {
|
|
46
|
+
"source": "anthropics/skills",
|
|
47
|
+
"sourceType": "github",
|
|
48
|
+
"computedHash": "57f470f512f45bdac598e302bc72fd62bf2b649fc7fad032efe97720149cde4d"
|
|
49
|
+
},
|
|
50
|
+
"vercel-react-best-practices": {
|
|
51
|
+
"source": "vercel-labs/agent-skills",
|
|
52
|
+
"sourceType": "github",
|
|
53
|
+
"computedHash": "257b84bf218a7d3b2cba56e929b7e933cf71cb89f2e24ab601759c599d1c23f2"
|
|
54
|
+
},
|
|
55
|
+
"web-design-guidelines": {
|
|
56
|
+
"source": "vercel-labs/agent-skills",
|
|
57
|
+
"sourceType": "github",
|
|
58
|
+
"computedHash": "f3bc47f890f42a44db1007ab390709ec368e4b8c089baee6b0007182236ac474"
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# UI Polish & Responsive Improvements
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Improve the visual quality, component consistency, and responsive behavior of the boilerplate UI across all pages. This includes refreshing the color palette with a subtle blue accent, replacing bare HTML elements with shadcn components, adding hover/transition effects via a reusable utility class, and introducing `sm:` breakpoints throughout for better tablet/mobile scaling. All custom styling goes in globals.css — no inline or custom CSS on components.
|
|
6
|
+
|
|
7
|
+
## Quick Links
|
|
8
|
+
|
|
9
|
+
- [Requirements](./requirements.md) — full requirements and acceptance criteria
|
|
10
|
+
- [Action Required](./action-required.md) — manual steps needing human action
|
|
11
|
+
|
|
12
|
+
## Dependency Graph
|
|
13
|
+
|
|
14
|
+
```mermaid
|
|
15
|
+
graph TD
|
|
16
|
+
task-01-globals-css["01: globals.css Foundation"]
|
|
17
|
+
task-02-layout["02: Layout Sticky Footer"]
|
|
18
|
+
task-03-site-header["03: Site Header Responsive"]
|
|
19
|
+
task-04-site-footer["04: Site Footer Responsive"]
|
|
20
|
+
task-05-home-page["05: Home Page Overhaul"]
|
|
21
|
+
task-06-dashboard["06: Dashboard Page"]
|
|
22
|
+
task-07-chat-page["07: Chat Page"]
|
|
23
|
+
task-08-profile-page["08: Profile Page"]
|
|
24
|
+
task-09-auth-pages["09: Auth Pages"]
|
|
25
|
+
task-10-setup-checklist["10: Setup Checklist"]
|
|
26
|
+
task-11-starter-prompt-modal["11: Starter Prompt Modal"]
|
|
27
|
+
task-01-globals-css --> task-05-home-page
|
|
28
|
+
task-01-globals-css --> task-06-dashboard
|
|
29
|
+
task-01-globals-css --> task-07-chat-page
|
|
30
|
+
task-01-globals-css --> task-08-profile-page
|
|
31
|
+
task-01-globals-css --> task-09-auth-pages
|
|
32
|
+
task-01-globals-css --> task-10-setup-checklist
|
|
33
|
+
task-01-globals-css --> task-11-starter-prompt-modal
|
|
34
|
+
task-02-layout --> task-09-auth-pages
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Waves
|
|
38
|
+
|
|
39
|
+
| Wave | Tasks | Description |
|
|
40
|
+
|------|-------|-------------|
|
|
41
|
+
| 1 | task-01, task-02, task-03, task-04 | Foundation: globals.css enhancements, layout flex structure, header/footer responsive |
|
|
42
|
+
| 2 | task-05, task-06, task-07, task-08, task-09, task-10, task-11 | All pages: Card adoption, responsive breakpoints, component swaps |
|
|
43
|
+
|
|
44
|
+
## Task Status
|
|
45
|
+
|
|
46
|
+
### Wave 1
|
|
47
|
+
- [x] [task-01-globals-css](./tasks/task-01-globals-css.md) — globals.css color palette, animations, and utility classes
|
|
48
|
+
- [x] [task-02-layout](./tasks/task-02-layout.md) — Root layout sticky footer with flex column
|
|
49
|
+
- [x] [task-03-site-header](./tasks/task-03-site-header.md) — Header responsive padding and sizing
|
|
50
|
+
- [x] [task-04-site-footer](./tasks/task-04-site-footer.md) — Footer responsive padding
|
|
51
|
+
|
|
52
|
+
### Wave 2
|
|
53
|
+
- [ ] [task-05-home-page](./tasks/task-05-home-page.md) — Home page Card adoption + responsive typography
|
|
54
|
+
- [ ] [task-06-dashboard](./tasks/task-06-dashboard.md) — Dashboard Card adoption + responsive grid
|
|
55
|
+
- [ ] [task-07-chat-page](./tasks/task-07-chat-page.md) — Chat Input swap + sticky form + responsive
|
|
56
|
+
- [ ] [task-08-profile-page](./tasks/task-08-profile-page.md) — Profile responsive stacking + grid fixes
|
|
57
|
+
- [ ] [task-09-auth-pages](./tasks/task-09-auth-pages.md) — Auth pages animation, shadow, and background
|
|
58
|
+
- [ ] [task-10-setup-checklist](./tasks/task-10-setup-checklist.md) — Setup checklist Card adoption
|
|
59
|
+
- [ ] [task-11-starter-prompt-modal](./tasks/task-11-starter-prompt-modal.md) — Textarea swap + responsive buttons
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Requirements: UI Polish & Responsive Improvements
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
The boilerplate UI is functional but visually flat — bare `<div>` elements instead of shadcn Cards, a monotone neutral-gray palette, no hover/transition effects, and minimal responsive breakpoints (most pages only use `md:`). The goal is to meaningfully improve visual quality, component consistency, and responsive behavior across all pages and components.
|
|
6
|
+
|
|
7
|
+
All changes must use Tailwind utilities and shadcn standards. Custom styling (animations, utilities, color tokens) goes in `globals.css`. No custom inline styles or CSS-in-JS on individual components. The result should look like a polished, high-quality default that can be customized by users of the boilerplate.
|
|
8
|
+
|
|
9
|
+
## Goals
|
|
10
|
+
|
|
11
|
+
- Refresh the color palette with a subtle cool blue accent (shift primary/ring/accent from flat gray to hue 270)
|
|
12
|
+
- Replace all bare `<div>` cards with shadcn Card components for consistency
|
|
13
|
+
- Replace native `<input>`, `<button>`, and `<textarea>` elements with their shadcn equivalents
|
|
14
|
+
- Add hover/transition effects to interactive cards via a reusable `card-interactive` utility
|
|
15
|
+
- Introduce `sm:` breakpoints throughout for proper tablet/mobile scaling
|
|
16
|
+
- Add entrance animations to auth pages
|
|
17
|
+
- Fix the sticky footer layout so it works on short-content pages
|
|
18
|
+
- Ensure all pages scale well from 320px to 1536px+ viewports
|
|
19
|
+
|
|
20
|
+
## Non-Goals
|
|
21
|
+
|
|
22
|
+
- No hamburger/mobile menu for the header — the current content (avatar + theme toggle) is minimal enough
|
|
23
|
+
- No new shadcn component installations — all needed components are already installed
|
|
24
|
+
- No changes to business logic, API routes, or authentication flows
|
|
25
|
+
- No new pages or routes
|
|
26
|
+
- No changes to the Geist font choice
|
|
27
|
+
- No Storybook or component documentation
|
|
28
|
+
|
|
29
|
+
## Acceptance Criteria
|
|
30
|
+
|
|
31
|
+
- [ ] All pages render correctly in both light and dark modes
|
|
32
|
+
- [ ] No horizontal scroll on any page at 320px viewport width
|
|
33
|
+
- [ ] Feature cards, dashboard cards, and next steps cards use shadcn Card components
|
|
34
|
+
- [ ] Chat input uses shadcn Input, not a native `<input>`
|
|
35
|
+
- [ ] Footer sticks to the bottom on short-content pages (auth pages)
|
|
36
|
+
- [ ] Primary color has a visible cool-blue tint (not flat gray)
|
|
37
|
+
- [ ] Cards have hover lift effect with shadow transition
|
|
38
|
+
- [ ] All grids have `sm:` breakpoints for tablet-size viewports
|
|
39
|
+
- [ ] `pnpm lint` and `pnpm typecheck` pass with no errors
|
|
40
|
+
|
|
41
|
+
## Assumptions
|
|
42
|
+
|
|
43
|
+
- Tailwind CSS v4 is in use (confirmed: `@import "tailwindcss"` syntax, `@theme inline` block)
|
|
44
|
+
- `tw-animate-css` is installed in dependencies but currently unused (confirmed in package.json)
|
|
45
|
+
- The ThemeProvider from next-themes renders children directly without a wrapping `<div>` (confirmed by reading the component)
|
|
46
|
+
- All shadcn components needed (Card, Input, Button, Textarea, Badge, Avatar, Dialog) are already installed
|
|
47
|
+
|
|
48
|
+
## Technical Constraints
|
|
49
|
+
|
|
50
|
+
- All custom CSS (animations, utilities, color tokens) must go in `src/app/globals.css`
|
|
51
|
+
- Component files should only use Tailwind utility classes and shadcn components — no `style={{}}` props
|
|
52
|
+
- Must maintain both light and dark mode support via the existing OKLch CSS variable system
|
|
53
|
+
- Must not break existing functionality (auth flows, chat, diagnostics)
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# Task 01: globals.css Foundation
|
|
2
|
+
|
|
3
|
+
## Status
|
|
4
|
+
|
|
5
|
+
complete
|
|
6
|
+
|
|
7
|
+
## Wave
|
|
8
|
+
|
|
9
|
+
1
|
|
10
|
+
|
|
11
|
+
## Description
|
|
12
|
+
|
|
13
|
+
Update `globals.css` to establish the visual foundation for the entire UI improvement. This includes importing the unused `tw-animate-css` package, refreshing the color palette with a subtle blue accent, adding custom keyframe animations, expanding the base layer with better defaults, and defining reusable utility classes. All subsequent tasks depend on the utilities and color tokens defined here.
|
|
14
|
+
|
|
15
|
+
## Dependencies
|
|
16
|
+
|
|
17
|
+
**Depends on:** None (Wave 1)
|
|
18
|
+
**Blocks:** task-05-home-page.md, task-06-dashboard.md, task-07-chat-page.md, task-08-profile-page.md, task-09-auth-pages.md, task-10-setup-checklist.md, task-11-starter-prompt-modal.md
|
|
19
|
+
|
|
20
|
+
**Context from dependencies:** N/A — this is the foundation task.
|
|
21
|
+
|
|
22
|
+
## Files to Modify
|
|
23
|
+
|
|
24
|
+
- `src/app/globals.css` — Add tw-animate-css import, update color tokens, add animations, expand base layer, add utility classes
|
|
25
|
+
|
|
26
|
+
## Technical Details
|
|
27
|
+
|
|
28
|
+
### Implementation Steps
|
|
29
|
+
|
|
30
|
+
1. **Add tw-animate-css import** — The package `tw-animate-css@1.4.0` is already installed (in package.json) but never imported. Add the import right after the tailwindcss import:
|
|
31
|
+
|
|
32
|
+
```css
|
|
33
|
+
@import "tailwindcss";
|
|
34
|
+
@import "tw-animate-css";
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
2. **Add animation tokens to `@theme inline`** — Add these at the end of the existing `@theme inline` block (after the `--radius-xl` line):
|
|
38
|
+
|
|
39
|
+
```css
|
|
40
|
+
--animate-fade-in: fade-in 0.3s ease-out;
|
|
41
|
+
--animate-fade-up: fade-up 0.4s ease-out;
|
|
42
|
+
--animate-scale-in: scale-in 0.2s ease-out;
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
3. **Update light mode color tokens in `:root`** — Change these 3 values (leave all other tokens unchanged):
|
|
46
|
+
|
|
47
|
+
```css
|
|
48
|
+
/* CHANGE these 3 lines: */
|
|
49
|
+
--primary: oklch(0.21 0.034 270); /* was oklch(0.21 0.006 285.885) */
|
|
50
|
+
--ring: oklch(0.705 0.06 270); /* was oklch(0.705 0.015 286.067) */
|
|
51
|
+
--accent: oklch(0.96 0.012 270); /* was oklch(0.967 0.001 286.375) */
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
4. **Update dark mode color tokens in `.dark`** — Change these 3 values (leave all other tokens unchanged):
|
|
55
|
+
|
|
56
|
+
```css
|
|
57
|
+
/* CHANGE these 3 lines: */
|
|
58
|
+
--primary: oklch(0.92 0.02 270); /* was oklch(0.92 0.004 286.32) */
|
|
59
|
+
--ring: oklch(0.552 0.05 270); /* was oklch(0.552 0.016 285.938) */
|
|
60
|
+
--accent: oklch(0.28 0.018 270); /* was oklch(0.274 0.006 286.033) */
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
5. **Add keyframe definitions** — Add these right before the `@layer base` block:
|
|
64
|
+
|
|
65
|
+
```css
|
|
66
|
+
@keyframes fade-in {
|
|
67
|
+
from { opacity: 0; }
|
|
68
|
+
to { opacity: 1; }
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
@keyframes fade-up {
|
|
72
|
+
from { opacity: 0; transform: translateY(8px); }
|
|
73
|
+
to { opacity: 1; transform: translateY(0); }
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
@keyframes scale-in {
|
|
77
|
+
from { opacity: 0; transform: scale(0.97); }
|
|
78
|
+
to { opacity: 1; transform: scale(1); }
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
6. **Expand the `@layer base` block** — Replace the existing `@layer base` block with:
|
|
83
|
+
|
|
84
|
+
```css
|
|
85
|
+
@layer base {
|
|
86
|
+
* {
|
|
87
|
+
@apply border-border;
|
|
88
|
+
}
|
|
89
|
+
html {
|
|
90
|
+
scroll-behavior: smooth;
|
|
91
|
+
}
|
|
92
|
+
body {
|
|
93
|
+
@apply bg-background text-foreground;
|
|
94
|
+
font-feature-settings: "rlig" 1, "calt" 1;
|
|
95
|
+
}
|
|
96
|
+
:focus-visible {
|
|
97
|
+
@apply outline-2 outline-offset-2 outline-ring;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
7. **Add utility classes** — Add a new `@layer utilities` block after the `@layer base` block:
|
|
103
|
+
|
|
104
|
+
```css
|
|
105
|
+
@layer utilities {
|
|
106
|
+
.card-interactive {
|
|
107
|
+
@apply transition-all duration-200 ease-out;
|
|
108
|
+
}
|
|
109
|
+
.card-interactive:hover {
|
|
110
|
+
@apply shadow-md -translate-y-0.5;
|
|
111
|
+
}
|
|
112
|
+
.auth-bg {
|
|
113
|
+
background-image: radial-gradient(
|
|
114
|
+
circle at 50% 0%,
|
|
115
|
+
var(--accent) 0%,
|
|
116
|
+
transparent 50%
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Final file structure (order of sections)
|
|
123
|
+
|
|
124
|
+
1. `@import "tailwindcss";`
|
|
125
|
+
2. `@import "tw-animate-css";`
|
|
126
|
+
3. `@theme inline { ... }` (with animation tokens added at end)
|
|
127
|
+
4. `:root { ... }` (with 3 updated color values)
|
|
128
|
+
5. `.dark { ... }` (with 3 updated color values)
|
|
129
|
+
6. `@keyframes` definitions (3 keyframes)
|
|
130
|
+
7. `@layer base { ... }` (expanded)
|
|
131
|
+
8. `@layer utilities { ... }` (new)
|
|
132
|
+
|
|
133
|
+
## Acceptance Criteria
|
|
134
|
+
|
|
135
|
+
- [ ] `tw-animate-css` is imported and animation utilities like `animate-fade-up` are available
|
|
136
|
+
- [ ] `:root` has `--primary: oklch(0.21 0.034 270)`, `--ring: oklch(0.705 0.06 270)`, `--accent: oklch(0.96 0.012 270)`
|
|
137
|
+
- [ ] `.dark` has `--primary: oklch(0.92 0.02 270)`, `--ring: oklch(0.552 0.05 270)`, `--accent: oklch(0.28 0.018 270)`
|
|
138
|
+
- [ ] Three keyframe animations (`fade-in`, `fade-up`, `scale-in`) are defined
|
|
139
|
+
- [ ] `@theme inline` includes `--animate-fade-in`, `--animate-fade-up`, `--animate-scale-in`
|
|
140
|
+
- [ ] `.card-interactive` utility class is defined with hover shadow and translate
|
|
141
|
+
- [ ] `.auth-bg` utility class is defined with radial gradient
|
|
142
|
+
- [ ] `html` has `scroll-behavior: smooth`
|
|
143
|
+
- [ ] `:focus-visible` has global outline styling
|
|
144
|
+
- [ ] All other existing color tokens remain unchanged
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Task 02: Layout Sticky Footer
|
|
2
|
+
|
|
3
|
+
## Status
|
|
4
|
+
|
|
5
|
+
complete
|
|
6
|
+
|
|
7
|
+
## Wave
|
|
8
|
+
|
|
9
|
+
1
|
|
10
|
+
|
|
11
|
+
## Description
|
|
12
|
+
|
|
13
|
+
Update the root layout to use a flex column structure that pushes the footer to the bottom of the viewport on short-content pages. Currently, pages like login/register have minimal content and the footer floats up, leaving blank space below. Adding `min-h-screen flex flex-col` to the body and `flex-1` to the main element creates a proper sticky footer layout.
|
|
14
|
+
|
|
15
|
+
## Dependencies
|
|
16
|
+
|
|
17
|
+
**Depends on:** None (Wave 1)
|
|
18
|
+
**Blocks:** task-09-auth-pages.md (auth pages rely on the flex-1 main for proper vertical centering)
|
|
19
|
+
|
|
20
|
+
**Context from dependencies:** N/A — this is a foundation task.
|
|
21
|
+
|
|
22
|
+
## Files to Modify
|
|
23
|
+
|
|
24
|
+
- `src/app/layout.tsx` — Add flex classes to body and main elements
|
|
25
|
+
|
|
26
|
+
## Technical Details
|
|
27
|
+
|
|
28
|
+
### Implementation Steps
|
|
29
|
+
|
|
30
|
+
1. **Add flex layout classes to the `<body>` element** (line 92). The current className is:
|
|
31
|
+
|
|
32
|
+
```tsx
|
|
33
|
+
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Change it to:
|
|
37
|
+
|
|
38
|
+
```tsx
|
|
39
|
+
className={`${geistSans.variable} ${geistMono.variable} antialiased min-h-screen flex flex-col`}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
2. **Add `flex-1` to the `<main>` element** (line 101). The current element is:
|
|
43
|
+
|
|
44
|
+
```tsx
|
|
45
|
+
<main id="main-content">{children}</main>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Change it to:
|
|
49
|
+
|
|
50
|
+
```tsx
|
|
51
|
+
<main id="main-content" className="flex-1">{children}</main>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Why this works
|
|
55
|
+
|
|
56
|
+
The ThemeProvider component (`src/components/theme-provider.tsx`) is a pass-through wrapper around `next-themes` ThemeProvider — it renders children directly without adding a wrapping `<div>`. So the flex column chain from `<body>` flows directly through to `<SiteHeader>`, `<main>`, and `<SiteFooter>`.
|
|
57
|
+
|
|
58
|
+
The `min-h-screen` ensures the body fills at least the full viewport. `flex flex-col` creates a vertical flex container. `flex-1` on `<main>` makes it expand to fill all available space, pushing `<SiteFooter>` to the bottom.
|
|
59
|
+
|
|
60
|
+
## Acceptance Criteria
|
|
61
|
+
|
|
62
|
+
- [ ] `<body>` has classes `min-h-screen flex flex-col` in addition to existing font variable classes
|
|
63
|
+
- [ ] `<main>` has `className="flex-1"`
|
|
64
|
+
- [ ] On short-content pages (e.g. `/login`), the footer sits at the bottom of the viewport
|
|
65
|
+
- [ ] On long-content pages (e.g. `/profile`), the footer sits below the content as usual
|
|
66
|
+
- [ ] No visual regressions on any page
|