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,359 @@
|
|
|
1
|
+
# WebGPU Device Loss Handling
|
|
2
|
+
|
|
3
|
+
## What Is Device Loss?
|
|
4
|
+
|
|
5
|
+
Device loss occurs when the GPU driver cannot continue processing commands. Causes include:
|
|
6
|
+
|
|
7
|
+
- Driver crashes
|
|
8
|
+
- Extreme resource pressure
|
|
9
|
+
- Long-running shaders (GPU watchdog triggers after ~10 seconds)
|
|
10
|
+
- Driver updates
|
|
11
|
+
- Significant device configuration changes
|
|
12
|
+
|
|
13
|
+
When a device is lost, the `GPUDevice` object and **all objects created with it become unusable**. All buffers, textures, pipelines, and GPU memory are discarded.
|
|
14
|
+
|
|
15
|
+
## Listening for Device Loss
|
|
16
|
+
|
|
17
|
+
Detect loss by attaching a callback to the device's `lost` promise:
|
|
18
|
+
|
|
19
|
+
```javascript
|
|
20
|
+
const adapter = await navigator.gpu.requestAdapter();
|
|
21
|
+
if (!adapter) { return; }
|
|
22
|
+
const device = await adapter.requestDevice();
|
|
23
|
+
|
|
24
|
+
device.lost.then((info) => {
|
|
25
|
+
console.error('WebGPU device lost:', info.message);
|
|
26
|
+
// Handle recovery
|
|
27
|
+
});
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**Important:** Don't `await` this promise directly - it will block indefinitely if loss never occurs.
|
|
31
|
+
|
|
32
|
+
### Device Loss Information
|
|
33
|
+
|
|
34
|
+
The `GPUDeviceLostInfo` object provides:
|
|
35
|
+
|
|
36
|
+
| Property | Description |
|
|
37
|
+
|----------|-------------|
|
|
38
|
+
| `reason` | `'destroyed'` (intentional via `destroy()`) or `'unknown'` (unexpected) |
|
|
39
|
+
| `message` | Human-readable debugging info (don't parse programmatically) |
|
|
40
|
+
|
|
41
|
+
```javascript
|
|
42
|
+
device.lost.then((info) => {
|
|
43
|
+
if (info.reason === 'unknown') {
|
|
44
|
+
// Unexpected loss - attempt recovery
|
|
45
|
+
handleUnexpectedDeviceLoss();
|
|
46
|
+
} else {
|
|
47
|
+
// Intentional destruction - expected behavior
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Devices Starting Lost
|
|
53
|
+
|
|
54
|
+
`adapter.requestDevice()` always returns a `GPUDevice`, but it may already be lost if creation failed. This occurs when the adapter was "consumed" (used previously) or "expired."
|
|
55
|
+
|
|
56
|
+
**Best practice:** Always get a new adapter right before requesting a device.
|
|
57
|
+
|
|
58
|
+
## Recovery Strategies
|
|
59
|
+
|
|
60
|
+
### Minimal Recovery (Page Reload)
|
|
61
|
+
|
|
62
|
+
For simple applications:
|
|
63
|
+
|
|
64
|
+
```javascript
|
|
65
|
+
device.lost.then((info) => {
|
|
66
|
+
if (info.reason === 'unknown') {
|
|
67
|
+
// Warn user before reload
|
|
68
|
+
alert('Graphics error occurred. The page will reload.');
|
|
69
|
+
location.reload();
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Restart GPU Content Only (Recommended for Three.js)
|
|
75
|
+
|
|
76
|
+
Recreate the device and reconfigure the canvas without full page reload:
|
|
77
|
+
|
|
78
|
+
```javascript
|
|
79
|
+
import * as THREE from 'three/webgpu';
|
|
80
|
+
|
|
81
|
+
let renderer;
|
|
82
|
+
let scene, camera;
|
|
83
|
+
|
|
84
|
+
async function initWebGPU() {
|
|
85
|
+
renderer = new THREE.WebGPURenderer();
|
|
86
|
+
await renderer.init();
|
|
87
|
+
|
|
88
|
+
// Access the underlying WebGPU device
|
|
89
|
+
const device = renderer.backend.device;
|
|
90
|
+
|
|
91
|
+
device.lost.then((info) => {
|
|
92
|
+
console.error('Device lost:', info.message);
|
|
93
|
+
if (info.reason === 'unknown') {
|
|
94
|
+
// Dispose current renderer
|
|
95
|
+
renderer.dispose();
|
|
96
|
+
// Reinitialize
|
|
97
|
+
initWebGPU();
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
// Configure canvas
|
|
102
|
+
renderer.setSize(window.innerWidth, window.innerHeight);
|
|
103
|
+
document.body.appendChild(renderer.domElement);
|
|
104
|
+
|
|
105
|
+
// Recreate scene content
|
|
106
|
+
setupScene();
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function setupScene() {
|
|
110
|
+
scene = new THREE.Scene();
|
|
111
|
+
camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
|
|
112
|
+
// ... add meshes, lights, etc.
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
initWebGPU();
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Restore with Application State
|
|
119
|
+
|
|
120
|
+
For applications with user progress or configuration:
|
|
121
|
+
|
|
122
|
+
```javascript
|
|
123
|
+
let appState = {
|
|
124
|
+
cameraPosition: { x: 0, y: 5, z: 10 },
|
|
125
|
+
settings: {},
|
|
126
|
+
// Don't save transient data like particle positions
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
// Save state periodically
|
|
130
|
+
function saveState() {
|
|
131
|
+
appState.cameraPosition = {
|
|
132
|
+
x: camera.position.x,
|
|
133
|
+
y: camera.position.y,
|
|
134
|
+
z: camera.position.z
|
|
135
|
+
};
|
|
136
|
+
localStorage.setItem('appState', JSON.stringify(appState));
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Restore on recovery
|
|
140
|
+
async function initWebGPU() {
|
|
141
|
+
renderer = new THREE.WebGPURenderer();
|
|
142
|
+
await renderer.init();
|
|
143
|
+
|
|
144
|
+
const savedState = localStorage.getItem('appState');
|
|
145
|
+
if (savedState) {
|
|
146
|
+
appState = JSON.parse(savedState);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
setupScene();
|
|
150
|
+
|
|
151
|
+
// Restore camera position
|
|
152
|
+
camera.position.set(
|
|
153
|
+
appState.cameraPosition.x,
|
|
154
|
+
appState.cameraPosition.y,
|
|
155
|
+
appState.cameraPosition.z
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
renderer.backend.device.lost.then((info) => {
|
|
159
|
+
if (info.reason === 'unknown') {
|
|
160
|
+
saveState();
|
|
161
|
+
renderer.dispose();
|
|
162
|
+
initWebGPU();
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## When Recovery Fails
|
|
169
|
+
|
|
170
|
+
If `requestAdapter()` returns `null` after device loss, the OS or browser has blocked GPU access:
|
|
171
|
+
|
|
172
|
+
```javascript
|
|
173
|
+
async function initWebGPU() {
|
|
174
|
+
const adapter = await navigator.gpu.requestAdapter();
|
|
175
|
+
|
|
176
|
+
if (!adapter) {
|
|
177
|
+
// Check if this is initial failure or post-loss failure
|
|
178
|
+
if (hadPreviousDevice) {
|
|
179
|
+
showMessage('GPU access lost. Please restart your browser.');
|
|
180
|
+
} else {
|
|
181
|
+
showMessage('WebGPU is not supported on this device.');
|
|
182
|
+
}
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Continue with device creation...
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## Testing Device Loss
|
|
191
|
+
|
|
192
|
+
### Using destroy()
|
|
193
|
+
|
|
194
|
+
Call `device.destroy()` to simulate loss:
|
|
195
|
+
|
|
196
|
+
```javascript
|
|
197
|
+
let simulatedLoss = false;
|
|
198
|
+
|
|
199
|
+
function simulateDeviceLoss() {
|
|
200
|
+
simulatedLoss = true;
|
|
201
|
+
renderer.backend.device.destroy();
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// In your device.lost handler:
|
|
205
|
+
device.lost.then((info) => {
|
|
206
|
+
if (info.reason === 'unknown' || simulatedLoss) {
|
|
207
|
+
simulatedLoss = false;
|
|
208
|
+
// Treat as unexpected loss for testing
|
|
209
|
+
handleDeviceLoss();
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
// Add debug keybinding
|
|
214
|
+
window.addEventListener('keydown', (e) => {
|
|
215
|
+
if (e.key === 'L' && e.ctrlKey && e.shiftKey) {
|
|
216
|
+
simulateDeviceLoss();
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
**Limitations of destroy():**
|
|
222
|
+
- Unmaps buffers immediately (real loss doesn't)
|
|
223
|
+
- Always allows device recovery (real loss may not)
|
|
224
|
+
|
|
225
|
+
### Chrome GPU Process Crash Testing
|
|
226
|
+
|
|
227
|
+
Navigate to `about:gpucrash` in a **separate tab** to crash the GPU process.
|
|
228
|
+
|
|
229
|
+
Chrome enforces escalating restrictions:
|
|
230
|
+
|
|
231
|
+
| Crash | Effect |
|
|
232
|
+
|-------|--------|
|
|
233
|
+
| 1st | New adapters allowed |
|
|
234
|
+
| 2nd within 2 min | Adapter requests fail (resets on page refresh) |
|
|
235
|
+
| 3rd within 2 min | All pages blocked (reset after 2 min or browser restart) |
|
|
236
|
+
| 3-6 within 5 min | GPU process stops restarting; browser restart required |
|
|
237
|
+
|
|
238
|
+
### Chrome Testing Flags
|
|
239
|
+
|
|
240
|
+
Bypass crash limits for development:
|
|
241
|
+
|
|
242
|
+
```bash
|
|
243
|
+
# macOS
|
|
244
|
+
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \
|
|
245
|
+
--disable-domain-blocking-for-3d-apis \
|
|
246
|
+
--disable-gpu-process-crash-limit
|
|
247
|
+
|
|
248
|
+
# Windows
|
|
249
|
+
chrome.exe --disable-domain-blocking-for-3d-apis --disable-gpu-process-crash-limit
|
|
250
|
+
|
|
251
|
+
# Linux
|
|
252
|
+
google-chrome --disable-domain-blocking-for-3d-apis --disable-gpu-process-crash-limit
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
## Complete Example
|
|
256
|
+
|
|
257
|
+
```javascript
|
|
258
|
+
import * as THREE from 'three/webgpu';
|
|
259
|
+
import { color, time, oscSine } from 'three/tsl';
|
|
260
|
+
|
|
261
|
+
let renderer, scene, camera, mesh;
|
|
262
|
+
let hadPreviousDevice = false;
|
|
263
|
+
|
|
264
|
+
async function init() {
|
|
265
|
+
// Check WebGPU support
|
|
266
|
+
if (!navigator.gpu) {
|
|
267
|
+
showError('WebGPU not supported');
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// Create renderer
|
|
272
|
+
renderer = new THREE.WebGPURenderer({ antialias: true });
|
|
273
|
+
|
|
274
|
+
try {
|
|
275
|
+
await renderer.init();
|
|
276
|
+
} catch (e) {
|
|
277
|
+
if (hadPreviousDevice) {
|
|
278
|
+
showError('GPU recovery failed. Please restart browser.');
|
|
279
|
+
} else {
|
|
280
|
+
showError('Failed to initialize WebGPU.');
|
|
281
|
+
}
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
hadPreviousDevice = true;
|
|
286
|
+
|
|
287
|
+
// Setup device loss handler
|
|
288
|
+
const device = renderer.backend.device;
|
|
289
|
+
device.lost.then(handleDeviceLoss);
|
|
290
|
+
|
|
291
|
+
// Setup scene
|
|
292
|
+
renderer.setSize(window.innerWidth, window.innerHeight);
|
|
293
|
+
document.body.appendChild(renderer.domElement);
|
|
294
|
+
|
|
295
|
+
scene = new THREE.Scene();
|
|
296
|
+
camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
|
|
297
|
+
camera.position.z = 5;
|
|
298
|
+
|
|
299
|
+
const geometry = new THREE.BoxGeometry();
|
|
300
|
+
const material = new THREE.MeshStandardNodeMaterial();
|
|
301
|
+
material.colorNode = color(0x00ff00).mul(oscSine(time));
|
|
302
|
+
|
|
303
|
+
mesh = new THREE.Mesh(geometry, material);
|
|
304
|
+
scene.add(mesh);
|
|
305
|
+
|
|
306
|
+
const light = new THREE.DirectionalLight(0xffffff, 1);
|
|
307
|
+
light.position.set(5, 5, 5);
|
|
308
|
+
scene.add(light);
|
|
309
|
+
scene.add(new THREE.AmbientLight(0x404040));
|
|
310
|
+
|
|
311
|
+
animate();
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
function handleDeviceLoss(info) {
|
|
315
|
+
console.error('Device lost:', info.reason, info.message);
|
|
316
|
+
|
|
317
|
+
if (info.reason === 'unknown') {
|
|
318
|
+
// Cleanup
|
|
319
|
+
if (renderer) {
|
|
320
|
+
renderer.domElement.remove();
|
|
321
|
+
renderer.dispose();
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
// Attempt recovery after short delay
|
|
325
|
+
setTimeout(() => {
|
|
326
|
+
init();
|
|
327
|
+
}, 100);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
function animate() {
|
|
332
|
+
if (!renderer) return;
|
|
333
|
+
|
|
334
|
+
requestAnimationFrame(animate);
|
|
335
|
+
mesh.rotation.x += 0.01;
|
|
336
|
+
mesh.rotation.y += 0.01;
|
|
337
|
+
renderer.render(scene, camera);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
function showError(message) {
|
|
341
|
+
const div = document.createElement('div');
|
|
342
|
+
div.textContent = message;
|
|
343
|
+
div.style.cssText = 'position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);padding:20px;background:#f44;color:#fff;border-radius:8px;';
|
|
344
|
+
document.body.appendChild(div);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
init();
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
## Best Practices
|
|
351
|
+
|
|
352
|
+
1. **Always listen for device loss** - Even if you just show an error message
|
|
353
|
+
2. **Get a fresh adapter before each device request** - The GPU hardware may have changed
|
|
354
|
+
3. **Don't parse the message field** - It's implementation-specific and changes between browsers
|
|
355
|
+
4. **Save critical application state** - Restore user progress after recovery
|
|
356
|
+
5. **Don't save transient state** - Particle positions, physics state can be reset
|
|
357
|
+
6. **Test your recovery path** - Use `destroy()` and Chrome's `about:gpucrash`
|
|
358
|
+
7. **Handle adapter failure gracefully** - Distinguish between initial failure and post-loss failure
|
|
359
|
+
8. **Add a short delay before recovery** - Give the system time to stabilize
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# WebGPU Limits and Features
|
|
2
|
+
|
|
3
|
+
## Why This Matters
|
|
4
|
+
|
|
5
|
+
WebGPU devices have **default limits** (guaranteed minimums) that may be lower than what your application needs. For example, the default `maxBufferSize` is 256 MiB — if you create a large compute buffer, you'll silently get errors unless you request a higher limit. Similarly, optional **features** like `float32-filterable` must be explicitly enabled.
|
|
6
|
+
|
|
7
|
+
## Limits
|
|
8
|
+
|
|
9
|
+
Limits define numeric constraints on resources. Every WebGPU implementation guarantees a set of minimum values, but most GPUs support much higher limits.
|
|
10
|
+
|
|
11
|
+
Common limits you may need to increase:
|
|
12
|
+
|
|
13
|
+
| Limit | Default | When to Increase |
|
|
14
|
+
|-------|---------|------------------|
|
|
15
|
+
| `maxBufferSize` | 268435456 (256 MiB) | Large storage/vertex buffers |
|
|
16
|
+
| `maxStorageBufferBindingSize` | 134217728 (128 MiB) | Large compute storage buffers |
|
|
17
|
+
| `maxStorageBuffersPerShaderStage` | 8 | Many storage buffers in one shader |
|
|
18
|
+
| `maxComputeWorkgroupSizeX` | 128 | Large workgroup dimensions |
|
|
19
|
+
| `maxComputeInvocationsPerWorkgroup` | 128 | Dense compute workgroups |
|
|
20
|
+
| `maxColorAttachments` | 8 | Many render targets |
|
|
21
|
+
|
|
22
|
+
### Querying Adapter Limits
|
|
23
|
+
|
|
24
|
+
```javascript
|
|
25
|
+
const adapter = await navigator.gpu?.requestAdapter();
|
|
26
|
+
console.log(adapter.limits.maxBufferSize);
|
|
27
|
+
console.log(adapter.limits.maxStorageBufferBindingSize);
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Requesting Increased Limits
|
|
31
|
+
|
|
32
|
+
You must request higher limits when creating the device — otherwise you get the defaults, not the adapter's maximums.
|
|
33
|
+
|
|
34
|
+
**Raw WebGPU:**
|
|
35
|
+
```javascript
|
|
36
|
+
const adapter = await navigator.gpu?.requestAdapter();
|
|
37
|
+
const device = await adapter.requestDevice({
|
|
38
|
+
requiredLimits: {
|
|
39
|
+
maxBufferSize: 1024 * 1024 * 1024, // 1 GiB
|
|
40
|
+
maxStorageBufferBindingSize: 1024 * 1024 * 512, // 512 MiB
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**Three.js WebGPURenderer:**
|
|
46
|
+
|
|
47
|
+
Three.js accepts `requiredLimits` as a renderer constructor option, which gets passed through to `requestDevice()`:
|
|
48
|
+
|
|
49
|
+
```javascript
|
|
50
|
+
const renderer = new THREE.WebGPURenderer({
|
|
51
|
+
requiredLimits: {
|
|
52
|
+
maxBufferSize: 1024 * 1024 * 1024, // 1 GiB
|
|
53
|
+
maxStorageBufferBindingSize: 1024 * 1024 * 512, // 512 MiB
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
await renderer.init();
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
If the adapter doesn't support the requested limit, `requestDevice()` (or `renderer.init()`) will fail.
|
|
60
|
+
|
|
61
|
+
### Safe Pattern: Check Before Requesting
|
|
62
|
+
|
|
63
|
+
```javascript
|
|
64
|
+
const adapter = await navigator.gpu?.requestAdapter();
|
|
65
|
+
|
|
66
|
+
const desiredBufferSize = 1024 * 1024 * 1024; // 1 GiB
|
|
67
|
+
const requiredLimits = {};
|
|
68
|
+
|
|
69
|
+
if (adapter.limits.maxBufferSize >= desiredBufferSize) {
|
|
70
|
+
requiredLimits.maxBufferSize = desiredBufferSize;
|
|
71
|
+
} else {
|
|
72
|
+
console.warn('Adapter does not support 1 GiB buffers, using default');
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const renderer = new THREE.WebGPURenderer({ requiredLimits });
|
|
76
|
+
await renderer.init();
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Features
|
|
80
|
+
|
|
81
|
+
Features are optional capabilities that vary by GPU. Unlike limits, features are either present or absent — there's no numeric value to adjust.
|
|
82
|
+
|
|
83
|
+
### How Three.js Handles Features
|
|
84
|
+
|
|
85
|
+
Three.js automatically requests **all features supported by the adapter**. You generally don't need to manage features manually when using Three.js.
|
|
86
|
+
|
|
87
|
+
### Querying Available Features (Raw WebGPU)
|
|
88
|
+
|
|
89
|
+
```javascript
|
|
90
|
+
const adapter = await navigator.gpu?.requestAdapter();
|
|
91
|
+
// adapter.features is a Set
|
|
92
|
+
console.log(adapter.features.has('float32-filterable'));
|
|
93
|
+
console.log(adapter.features.has('shader-f16'));
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Common Optional Features
|
|
97
|
+
|
|
98
|
+
| Feature | Purpose |
|
|
99
|
+
|---------|---------|
|
|
100
|
+
| `float32-filterable` | Linear filtering on float32 textures |
|
|
101
|
+
| `float32-blendable` | Blending on float32 render targets |
|
|
102
|
+
| `shader-f16` | 16-bit floats in shaders |
|
|
103
|
+
| `texture-compression-bc` | BC (desktop) texture compression |
|
|
104
|
+
| `texture-compression-etc2` | ETC2 (mobile) texture compression |
|
|
105
|
+
| `texture-compression-astc` | ASTC (mobile) texture compression |
|
|
106
|
+
| `timestamp-query` | GPU timing measurements |
|
|
107
|
+
| `depth-clip-control` | Disable depth clipping |
|
|
108
|
+
| `dual-source-blending` | Two blend sources from one shader |
|
|
109
|
+
| `subgroups` | Subgroup operations in compute |
|
|
110
|
+
| `clip-distances` | Custom clip planes in vertex shader |
|
|
111
|
+
|
|
112
|
+
## Best Practices
|
|
113
|
+
|
|
114
|
+
1. **Only request limits you actually need** — requesting maximums hides portability issues where your app works on your GPU but fails on weaker ones
|
|
115
|
+
2. **Check adapter limits before requesting** — gracefully degrade when limits aren't available
|
|
116
|
+
3. **Don't forget storage buffer binding size** — `maxStorageBufferBindingSize` is often the bottleneck, not `maxBufferSize`
|
|
117
|
+
4. **Use [webgpureport.org](https://webgpureport.org)** to check what limits/features different GPUs support
|
|
118
|
+
|
|
119
|
+
## Debugging
|
|
120
|
+
|
|
121
|
+
If you're hitting buffer size errors or validation failures:
|
|
122
|
+
|
|
123
|
+
```javascript
|
|
124
|
+
// Log all adapter limits
|
|
125
|
+
const adapter = await navigator.gpu?.requestAdapter();
|
|
126
|
+
for (const [key, value] of Object.entries(Object.getPrototypeOf(adapter.limits))) {
|
|
127
|
+
if (typeof value !== 'function') {
|
|
128
|
+
console.log(`${key}: ${adapter.limits[key]}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Check Chrome DevTools console for WebGPU validation errors — they often mention which limit was exceeded.
|