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,204 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Type-Safe useChat with Agents
|
|
3
|
+
description: Build end-to-end type-safe agents by inferring UIMessage types from your agent definition.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Type-Safe useChat with Agents
|
|
7
|
+
|
|
8
|
+
Build end-to-end type-safe agents by inferring `UIMessage` types from your agent definition for type-safe UI rendering with `useChat`.
|
|
9
|
+
|
|
10
|
+
## Recommended Structure
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
lib/
|
|
14
|
+
agents/
|
|
15
|
+
my-agent.ts # Agent definition + type export
|
|
16
|
+
tools/
|
|
17
|
+
weather-tool.ts # Individual tool definitions
|
|
18
|
+
calculator-tool.ts
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Define Tools
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
// lib/tools/weather-tool.ts
|
|
25
|
+
import { tool } from 'ai';
|
|
26
|
+
import { z } from 'zod';
|
|
27
|
+
|
|
28
|
+
export const weatherTool = tool({
|
|
29
|
+
description: 'Get current weather for a location',
|
|
30
|
+
inputSchema: z.object({
|
|
31
|
+
location: z.string().describe('City name'),
|
|
32
|
+
}),
|
|
33
|
+
execute: async ({ location }) => {
|
|
34
|
+
return { temperature: 72, condition: 'sunny', location };
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Define Agent and Export Type
|
|
40
|
+
|
|
41
|
+
```ts
|
|
42
|
+
// lib/agents/my-agent.ts
|
|
43
|
+
import { ToolLoopAgent, InferAgentUIMessage } from 'ai';
|
|
44
|
+
import { weatherTool } from '../tools/weather-tool';
|
|
45
|
+
import { calculatorTool } from '../tools/calculator-tool';
|
|
46
|
+
|
|
47
|
+
export const myAgent = new ToolLoopAgent({
|
|
48
|
+
model: 'anthropic/claude-sonnet-4',
|
|
49
|
+
instructions: 'You are a helpful assistant.',
|
|
50
|
+
tools: {
|
|
51
|
+
weather: weatherTool,
|
|
52
|
+
calculator: calculatorTool,
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// Infer the UIMessage type from the agent
|
|
57
|
+
export type MyAgentUIMessage = InferAgentUIMessage<typeof myAgent>;
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### With Custom Metadata
|
|
61
|
+
|
|
62
|
+
```ts
|
|
63
|
+
// lib/agents/my-agent.ts
|
|
64
|
+
import { z } from 'zod';
|
|
65
|
+
|
|
66
|
+
const metadataSchema = z.object({
|
|
67
|
+
createdAt: z.number(),
|
|
68
|
+
model: z.string().optional(),
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
type MyMetadata = z.infer<typeof metadataSchema>;
|
|
72
|
+
|
|
73
|
+
export type MyAgentUIMessage = InferAgentUIMessage<typeof myAgent, MyMetadata>;
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Use with `useChat`
|
|
77
|
+
|
|
78
|
+
```tsx
|
|
79
|
+
// app/chat.tsx
|
|
80
|
+
import { useChat } from '@ai-sdk/react';
|
|
81
|
+
import type { MyAgentUIMessage } from '@/lib/agents/my-agent';
|
|
82
|
+
|
|
83
|
+
export function Chat() {
|
|
84
|
+
const { messages } = useChat<MyAgentUIMessage>();
|
|
85
|
+
|
|
86
|
+
return (
|
|
87
|
+
<div>
|
|
88
|
+
{messages.map(message => (
|
|
89
|
+
<Message key={message.id} message={message} />
|
|
90
|
+
))}
|
|
91
|
+
</div>
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Rendering Parts with Type Safety
|
|
97
|
+
|
|
98
|
+
Tool parts are typed as `tool-{toolName}` based on your agent's tools:
|
|
99
|
+
|
|
100
|
+
```tsx
|
|
101
|
+
function Message({ message }: { message: MyAgentUIMessage }) {
|
|
102
|
+
return (
|
|
103
|
+
<div>
|
|
104
|
+
{message.parts.map((part, i) => {
|
|
105
|
+
switch (part.type) {
|
|
106
|
+
case 'text':
|
|
107
|
+
return <p key={i}>{part.text}</p>;
|
|
108
|
+
|
|
109
|
+
case 'tool-weather':
|
|
110
|
+
// part.input and part.output are fully typed
|
|
111
|
+
if (part.state === 'output-available') {
|
|
112
|
+
return (
|
|
113
|
+
<div key={i}>
|
|
114
|
+
Weather in {part.input.location}: {part.output.temperature}F
|
|
115
|
+
</div>
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
return <div key={i}>Loading weather...</div>;
|
|
119
|
+
|
|
120
|
+
case 'tool-calculator':
|
|
121
|
+
// TypeScript knows this is the calculator tool
|
|
122
|
+
return <div key={i}>Calculating...</div>;
|
|
123
|
+
|
|
124
|
+
default:
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
})}
|
|
128
|
+
</div>
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
The `part.type` discriminant narrows the type, giving you autocomplete and type checking for `input` and `output` based on each tool's schema.
|
|
134
|
+
|
|
135
|
+
## Splitting Tool Rendering into Components
|
|
136
|
+
|
|
137
|
+
When rendering many tools, you may want to split each tool into its own component. Use `UIToolInvocation<TOOL>` to derive a typed invocation from your tool and export it alongside the tool definition:
|
|
138
|
+
|
|
139
|
+
```ts
|
|
140
|
+
// lib/tools/weather-tool.ts
|
|
141
|
+
import { tool, UIToolInvocation } from 'ai';
|
|
142
|
+
import { z } from 'zod';
|
|
143
|
+
|
|
144
|
+
export const weatherTool = tool({
|
|
145
|
+
description: 'Get current weather for a location',
|
|
146
|
+
inputSchema: z.object({
|
|
147
|
+
location: z.string().describe('City name'),
|
|
148
|
+
}),
|
|
149
|
+
execute: async ({ location }) => {
|
|
150
|
+
return { temperature: 72, condition: 'sunny', location };
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
// Export the invocation type for use in UI components
|
|
155
|
+
export type WeatherToolInvocation = UIToolInvocation<typeof weatherTool>;
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Then import only the type in your component:
|
|
159
|
+
|
|
160
|
+
```tsx
|
|
161
|
+
// components/weather-tool.tsx
|
|
162
|
+
import type { WeatherToolInvocation } from '@/lib/tools/weather-tool';
|
|
163
|
+
|
|
164
|
+
export function WeatherToolComponent({
|
|
165
|
+
invocation,
|
|
166
|
+
}: {
|
|
167
|
+
invocation: WeatherToolInvocation;
|
|
168
|
+
}) {
|
|
169
|
+
// invocation.input and invocation.output are fully typed
|
|
170
|
+
if (invocation.state === 'output-available') {
|
|
171
|
+
return (
|
|
172
|
+
<div>
|
|
173
|
+
Weather in {invocation.input.location}: {invocation.output.temperature}F
|
|
174
|
+
</div>
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
return <div>Loading weather for {invocation.input?.location}...</div>;
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Use the component in your message renderer:
|
|
182
|
+
|
|
183
|
+
```tsx
|
|
184
|
+
function Message({ message }: { message: MyAgentUIMessage }) {
|
|
185
|
+
return (
|
|
186
|
+
<div>
|
|
187
|
+
{message.parts.map((part, i) => {
|
|
188
|
+
switch (part.type) {
|
|
189
|
+
case 'text':
|
|
190
|
+
return <p key={i}>{part.text}</p>;
|
|
191
|
+
case 'tool-weather':
|
|
192
|
+
return <WeatherToolComponent key={i} invocation={part} />;
|
|
193
|
+
case 'tool-calculator':
|
|
194
|
+
return <CalculatorToolComponent key={i} invocation={part} />;
|
|
195
|
+
default:
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
})}
|
|
199
|
+
</div>
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
This approach keeps your tool rendering logic organized while maintaining full type safety, without needing to import the tool implementation into your UI components.
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: better-auth-best-practices
|
|
3
|
+
description: Configure Better Auth server and client, set up database adapters, manage sessions, add plugins, and handle environment variables. Use when users mention Better Auth, betterauth, auth.ts, or need to set up TypeScript authentication with email/password, OAuth, or plugin configuration.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Better Auth Integration Guide
|
|
7
|
+
|
|
8
|
+
**Always consult [better-auth.com/docs](https://better-auth.com/docs) for code examples and latest API.**
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Setup Workflow
|
|
13
|
+
|
|
14
|
+
1. Install: `npm install better-auth`
|
|
15
|
+
2. Set env vars: `BETTER_AUTH_SECRET` and `BETTER_AUTH_URL`
|
|
16
|
+
3. Create `auth.ts` with database + config
|
|
17
|
+
4. Create route handler for your framework
|
|
18
|
+
5. Run `npx @better-auth/cli@latest migrate`
|
|
19
|
+
6. Verify: call `GET /api/auth/ok` — should return `{ status: "ok" }`
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Quick Reference
|
|
24
|
+
|
|
25
|
+
### Environment Variables
|
|
26
|
+
- `BETTER_AUTH_SECRET` - Encryption secret (min 32 chars). Generate: `openssl rand -base64 32`
|
|
27
|
+
- `BETTER_AUTH_URL` - Base URL (e.g., `https://example.com`)
|
|
28
|
+
|
|
29
|
+
Only define `baseURL`/`secret` in config if env vars are NOT set.
|
|
30
|
+
|
|
31
|
+
### File Location
|
|
32
|
+
CLI looks for `auth.ts` in: `./`, `./lib`, `./utils`, or under `./src`. Use `--config` for custom path.
|
|
33
|
+
|
|
34
|
+
### CLI Commands
|
|
35
|
+
- `npx @better-auth/cli@latest migrate` - Apply schema (built-in adapter)
|
|
36
|
+
- `npx @better-auth/cli@latest generate` - Generate schema for Prisma/Drizzle
|
|
37
|
+
- `npx @better-auth/cli mcp --cursor` - Add MCP to AI tools
|
|
38
|
+
|
|
39
|
+
**Re-run after adding/changing plugins.**
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Core Config Options
|
|
44
|
+
|
|
45
|
+
| Option | Notes |
|
|
46
|
+
|--------|-------|
|
|
47
|
+
| `appName` | Optional display name |
|
|
48
|
+
| `baseURL` | Only if `BETTER_AUTH_URL` not set |
|
|
49
|
+
| `basePath` | Default `/api/auth`. Set `/` for root. |
|
|
50
|
+
| `secret` | Only if `BETTER_AUTH_SECRET` not set |
|
|
51
|
+
| `database` | Required for most features. See adapters docs. |
|
|
52
|
+
| `secondaryStorage` | Redis/KV for sessions & rate limits |
|
|
53
|
+
| `emailAndPassword` | `{ enabled: true }` to activate |
|
|
54
|
+
| `socialProviders` | `{ google: { clientId, clientSecret }, ... }` |
|
|
55
|
+
| `plugins` | Array of plugins |
|
|
56
|
+
| `trustedOrigins` | CSRF whitelist |
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Database
|
|
61
|
+
|
|
62
|
+
**Direct connections:** Pass `pg.Pool`, `mysql2` pool, `better-sqlite3`, or `bun:sqlite` instance.
|
|
63
|
+
|
|
64
|
+
**ORM adapters:** Import from `better-auth/adapters/drizzle`, `better-auth/adapters/prisma`, `better-auth/adapters/mongodb`.
|
|
65
|
+
|
|
66
|
+
**Critical:** Better Auth uses adapter model names, NOT underlying table names. If Prisma model is `User` mapping to table `users`, use `modelName: "user"` (Prisma reference), not `"users"`.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Session Management
|
|
71
|
+
|
|
72
|
+
**Storage priority:**
|
|
73
|
+
1. If `secondaryStorage` defined → sessions go there (not DB)
|
|
74
|
+
2. Set `session.storeSessionInDatabase: true` to also persist to DB
|
|
75
|
+
3. No database + `cookieCache` → fully stateless mode
|
|
76
|
+
|
|
77
|
+
**Cookie cache strategies:**
|
|
78
|
+
- `compact` (default) - Base64url + HMAC. Smallest.
|
|
79
|
+
- `jwt` - Standard JWT. Readable but signed.
|
|
80
|
+
- `jwe` - Encrypted. Maximum security.
|
|
81
|
+
|
|
82
|
+
**Key options:** `session.expiresIn` (default 7 days), `session.updateAge` (refresh interval), `session.cookieCache.maxAge`, `session.cookieCache.version` (change to invalidate all sessions).
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## User & Account Config
|
|
87
|
+
|
|
88
|
+
**User:** `user.modelName`, `user.fields` (column mapping), `user.additionalFields`, `user.changeEmail.enabled` (disabled by default), `user.deleteUser.enabled` (disabled by default).
|
|
89
|
+
|
|
90
|
+
**Account:** `account.modelName`, `account.accountLinking.enabled`, `account.storeAccountCookie` (for stateless OAuth).
|
|
91
|
+
|
|
92
|
+
**Required for registration:** `email` and `name` fields.
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Email Flows
|
|
97
|
+
|
|
98
|
+
- `emailVerification.sendVerificationEmail` - Must be defined for verification to work
|
|
99
|
+
- `emailVerification.sendOnSignUp` / `sendOnSignIn` - Auto-send triggers
|
|
100
|
+
- `emailAndPassword.sendResetPassword` - Password reset email handler
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Security
|
|
105
|
+
|
|
106
|
+
**In `advanced`:**
|
|
107
|
+
- `useSecureCookies` - Force HTTPS cookies
|
|
108
|
+
- `disableCSRFCheck` - ⚠️ Security risk
|
|
109
|
+
- `disableOriginCheck` - ⚠️ Security risk
|
|
110
|
+
- `crossSubDomainCookies.enabled` - Share cookies across subdomains
|
|
111
|
+
- `ipAddress.ipAddressHeaders` - Custom IP headers for proxies
|
|
112
|
+
- `database.generateId` - Custom ID generation or `"serial"`/`"uuid"`/`false`
|
|
113
|
+
|
|
114
|
+
**Rate limiting:** `rateLimit.enabled`, `rateLimit.window`, `rateLimit.max`, `rateLimit.storage` ("memory" | "database" | "secondary-storage").
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Hooks
|
|
119
|
+
|
|
120
|
+
**Endpoint hooks:** `hooks.before` / `hooks.after` - Array of `{ matcher, handler }`. Use `createAuthMiddleware`. Access `ctx.path`, `ctx.context.returned` (after), `ctx.context.session`.
|
|
121
|
+
|
|
122
|
+
**Database hooks:** `databaseHooks.user.create.before/after`, same for `session`, `account`. Useful for adding default values or post-creation actions.
|
|
123
|
+
|
|
124
|
+
**Hook context (`ctx.context`):** `session`, `secret`, `authCookies`, `password.hash()`/`verify()`, `adapter`, `internalAdapter`, `generateId()`, `tables`, `baseURL`.
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Plugins
|
|
129
|
+
|
|
130
|
+
**Import from dedicated paths for tree-shaking:**
|
|
131
|
+
```
|
|
132
|
+
import { twoFactor } from "better-auth/plugins/two-factor"
|
|
133
|
+
```
|
|
134
|
+
NOT `from "better-auth/plugins"`.
|
|
135
|
+
|
|
136
|
+
**Popular plugins:** `twoFactor`, `organization`, `passkey`, `magicLink`, `emailOtp`, `username`, `phoneNumber`, `admin`, `apiKey`, `bearer`, `jwt`, `multiSession`, `sso`, `oauthProvider`, `oidcProvider`, `openAPI`, `genericOAuth`.
|
|
137
|
+
|
|
138
|
+
Client plugins go in `createAuthClient({ plugins: [...] })`.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Client
|
|
143
|
+
|
|
144
|
+
Import from: `better-auth/client` (vanilla), `better-auth/react`, `better-auth/vue`, `better-auth/svelte`, `better-auth/solid`.
|
|
145
|
+
|
|
146
|
+
Key methods: `signUp.email()`, `signIn.email()`, `signIn.social()`, `signOut()`, `useSession()`, `getSession()`, `revokeSession()`, `revokeSessions()`.
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Type Safety
|
|
151
|
+
|
|
152
|
+
Infer types: `typeof auth.$Infer.Session`, `typeof auth.$Infer.Session.user`.
|
|
153
|
+
|
|
154
|
+
For separate client/server projects: `createAuthClient<typeof auth>()`.
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## Common Gotchas
|
|
159
|
+
|
|
160
|
+
1. **Model vs table name** - Config uses ORM model name, not DB table name
|
|
161
|
+
2. **Plugin schema** - Re-run CLI after adding plugins
|
|
162
|
+
3. **Secondary storage** - Sessions go there by default, not DB
|
|
163
|
+
4. **Cookie cache** - Custom session fields NOT cached, always re-fetched
|
|
164
|
+
5. **Stateless mode** - No DB = session in cookie only, logout on cache expiry
|
|
165
|
+
6. **Change email flow** - Sends to current email first, then new email
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## Resources
|
|
170
|
+
|
|
171
|
+
- [Docs](https://better-auth.com/docs)
|
|
172
|
+
- [Options Reference](https://better-auth.com/docs/reference/options)
|
|
173
|
+
- [LLMs.txt](https://better-auth.com/llms.txt)
|
|
174
|
+
- [GitHub](https://github.com/better-auth/better-auth)
|
|
175
|
+
- [Init Options Source](https://github.com/better-auth/better-auth/blob/main/packages/core/src/types/init-options.ts)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: caveman
|
|
3
|
+
description: >
|
|
4
|
+
Ultra-compressed communication mode. Cuts token usage ~75% by dropping
|
|
5
|
+
filler, articles, and pleasantries while keeping full technical accuracy.
|
|
6
|
+
Use when user says "caveman mode", "talk like caveman", "use caveman",
|
|
7
|
+
"less tokens", "be brief", or invokes /caveman.
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
Respond terse like smart caveman. All technical substance stay. Only fluff die.
|
|
11
|
+
|
|
12
|
+
## Persistence
|
|
13
|
+
|
|
14
|
+
ACTIVE EVERY RESPONSE once triggered. No revert after many turns. No filler drift. Still active if unsure. Off only when user says "stop caveman" or "normal mode".
|
|
15
|
+
|
|
16
|
+
## Rules
|
|
17
|
+
|
|
18
|
+
Drop: articles (a/an/the), filler (just/really/basically/actually/simply), pleasantries (sure/certainly/of course/happy to), hedging. Fragments OK. Short synonyms (big not extensive, fix not "implement a solution for"). Abbreviate common terms (DB/auth/config/req/res/fn/impl). Strip conjunctions. Use arrows for causality (X -> Y). One word when one word enough.
|
|
19
|
+
|
|
20
|
+
Technical terms stay exact. Code blocks unchanged. Errors quoted exact.
|
|
21
|
+
|
|
22
|
+
Pattern: `[thing] [action] [reason]. [next step].`
|
|
23
|
+
|
|
24
|
+
Not: "Sure! I'd be happy to help you with that. The issue you're experiencing is likely caused by..."
|
|
25
|
+
Yes: "Bug in auth middleware. Token expiry check use `<` not `<=`. Fix:"
|
|
26
|
+
|
|
27
|
+
### Examples
|
|
28
|
+
|
|
29
|
+
**"Why React component re-render?"**
|
|
30
|
+
|
|
31
|
+
> Inline obj prop -> new ref -> re-render. `useMemo`.
|
|
32
|
+
|
|
33
|
+
**"Explain database connection pooling."**
|
|
34
|
+
|
|
35
|
+
> Pool = reuse DB conn. Skip handshake -> fast under load.
|
|
36
|
+
|
|
37
|
+
## Auto-Clarity Exception
|
|
38
|
+
|
|
39
|
+
Drop caveman temporarily for: security warnings, irreversible action confirmations, multi-step sequences where fragment order risks misread, user asks to clarify or repeats question. Resume caveman after clear part done.
|
|
40
|
+
|
|
41
|
+
Example -- destructive op:
|
|
42
|
+
|
|
43
|
+
> **Warning:** This will permanently delete all rows in the `users` table and cannot be undone.
|
|
44
|
+
>
|
|
45
|
+
> ```sql
|
|
46
|
+
> DROP TABLE users;
|
|
47
|
+
> ```
|
|
48
|
+
>
|
|
49
|
+
> Caveman resume. Verify backup exist first.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: checkpoint
|
|
3
|
+
description: >
|
|
4
|
+
Create a comprehensive checkpoint commit with detailed analysis of all changes. Use this skill
|
|
5
|
+
when the user says "checkpoint", "commit everything", "save my progress", "create a commit",
|
|
6
|
+
or wants to stage and commit all current changes with a well-crafted message. Also use when
|
|
7
|
+
the user says "/checkpoint" or asks to snapshot current work. This skill stages all changes
|
|
8
|
+
and creates a descriptive commit — it does not push.
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Checkpoint Commit
|
|
12
|
+
|
|
13
|
+
Create a checkpoint commit that captures all current changes — but only after the code passes lint, type check, and build.
|
|
14
|
+
|
|
15
|
+
## Instructions
|
|
16
|
+
|
|
17
|
+
### Step 1: Analyze Changes
|
|
18
|
+
|
|
19
|
+
Run these commands to understand the full picture:
|
|
20
|
+
|
|
21
|
+
1. `git status` — see all tracked and untracked files
|
|
22
|
+
2. `git diff` — see detailed changes in tracked files
|
|
23
|
+
3. `git diff --cached` — see already-staged changes
|
|
24
|
+
4. `git log -5 --oneline` — understand this repo's commit message style
|
|
25
|
+
|
|
26
|
+
### Step 2: Quality Checks
|
|
27
|
+
|
|
28
|
+
Run all three checks. If any fail, fix the issues before proceeding — do not skip or ignore failures.
|
|
29
|
+
|
|
30
|
+
1. `npm run lint` — fix any lint errors
|
|
31
|
+
2. `npm run type-check` — fix any type errors (if the script doesn't exist, try `npx tsc --noEmit`)
|
|
32
|
+
3. `npm run build` — fix any build errors
|
|
33
|
+
|
|
34
|
+
Iterate until all three pass cleanly. Only then move to the next step.
|
|
35
|
+
|
|
36
|
+
### Step 3: Stage Everything
|
|
37
|
+
|
|
38
|
+
Stage all changes — tracked modifications, deletions, and new untracked files:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
git add -A
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Step 4: Craft the Commit Message
|
|
45
|
+
|
|
46
|
+
Write a commit message following the project's existing conventions (observed from `git log`). Structure:
|
|
47
|
+
|
|
48
|
+
- **First line**: clear, concise summary in imperative mood (50-72 chars)
|
|
49
|
+
- Use conventional commit prefixes where the project uses them: `feat:`, `fix:`, `refactor:`, `docs:`, `chore:`, etc.
|
|
50
|
+
- **Body** (separated by blank line): a short TL;DR of the changes — 1-3 sentences max. No bullet lists, no file-by-file breakdowns, no lengthy explanations.
|
|
51
|
+
- **Footer**: co-author attribution
|
|
52
|
+
|
|
53
|
+
### Step 5: Commit
|
|
54
|
+
|
|
55
|
+
Create the commit using a heredoc for proper formatting:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
git commit -m "$(cat <<'EOF'
|
|
59
|
+
{first line}
|
|
60
|
+
|
|
61
|
+
{tldr}
|
|
62
|
+
|
|
63
|
+
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
|
64
|
+
EOF
|
|
65
|
+
)"
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Step 6: Report
|
|
69
|
+
|
|
70
|
+
Display:
|
|
71
|
+
- The commit hash and message summary
|
|
72
|
+
- Files changed count
|
|
73
|
+
- Insertions/deletions summary
|
|
74
|
+
|
|
75
|
+
## Important
|
|
76
|
+
|
|
77
|
+
- Stage and commit everything — do not skip files unless they are clearly sensitive (`.env`, credentials)
|
|
78
|
+
- If the repo has no git history, run `git init` first
|
|
79
|
+
- All quality checks (lint, type-check, build) MUST pass before committing — fix issues, don't skip them
|
|
80
|
+
- Keep the commit body short — a TL;DR, not an essay
|
|
81
|
+
- Follow the project's existing commit conventions (check the log first)
|
|
82
|
+
- Do not push — only commit locally
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: create-spec
|
|
3
|
+
description: >
|
|
4
|
+
Create a structured feature specification with self-contained task files organized into
|
|
5
|
+
parallel execution waves. Use this skill when the user says "create a spec", "plan this feature",
|
|
6
|
+
"write up an implementation plan", "break this into tasks", or after any planning conversation
|
|
7
|
+
where the user wants to capture decisions as actionable spec files. Also use when the user
|
|
8
|
+
says "/create-spec" or wants to decompose a feature into work items that agents can implement
|
|
9
|
+
independently. This skill produces local spec files under specs/{feature}/ — no GitHub integration.
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Create Feature Specification
|
|
13
|
+
|
|
14
|
+
Transform a planning conversation into a structured spec folder that enables parallel agent implementation. The spec breaks a feature into self-contained task files — each one detailed enough that a coder agent can pick it up cold and implement it without reading anything else.
|
|
15
|
+
|
|
16
|
+
The key insight: implementation plans that live in a single file are either too large for a context window or too shallow for independent execution. By splitting into one file per task with full context in each, we enable multiple agents to work in parallel while keeping each agent's context focused.
|
|
17
|
+
|
|
18
|
+
## When to Use
|
|
19
|
+
|
|
20
|
+
- After a planning conversation where requirements and technical details have been discussed
|
|
21
|
+
- When the user asks to create a spec, plan a feature, or break work into tasks
|
|
22
|
+
- When the user wants to prepare work for parallel agent implementation
|
|
23
|
+
|
|
24
|
+
## Instructions
|
|
25
|
+
|
|
26
|
+
### Step 1: Gather Requirements
|
|
27
|
+
|
|
28
|
+
If the conversation already contains planning context (requirements discussed, technical decisions made, architecture outlined), extract all of it. Review the entire conversation to ensure nothing is lost — the spec is the single source of truth, and anything not captured here disappears.
|
|
29
|
+
|
|
30
|
+
If no planning conversation exists, interview the user:
|
|
31
|
+
- What does this feature do and why does it matter?
|
|
32
|
+
- What are the acceptance criteria?
|
|
33
|
+
- What technical constraints or decisions have been made?
|
|
34
|
+
- What files, APIs, schemas, or patterns are involved?
|
|
35
|
+
|
|
36
|
+
### Step 2: Name the Feature
|
|
37
|
+
|
|
38
|
+
Choose a kebab-case name that clearly identifies the feature (e.g., `add-user-auth`, `migrate-to-postgres`, `dashboard-redesign`). This becomes the folder name under `specs/`.
|
|
39
|
+
|
|
40
|
+
### Step 3: Decompose into Tasks
|
|
41
|
+
|
|
42
|
+
Break the implementation into atomic tasks. Each task should:
|
|
43
|
+
- Be completable in a single coding session by one agent
|
|
44
|
+
- Have a clear, specific scope (one concern per task)
|
|
45
|
+
- Produce working, testable code when complete
|
|
46
|
+
- Not overlap in files modified with other tasks in the same wave
|
|
47
|
+
|
|
48
|
+
Think carefully about granularity. Too coarse and agents can't work in parallel. Too fine and the overhead of context-switching between tasks dominates. A good task typically creates or modifies 1-5 files around a single concern.
|
|
49
|
+
|
|
50
|
+
Do NOT include testing tasks (unit tests, e2e tests) unless the user explicitly asks for them.
|
|
51
|
+
|
|
52
|
+
### Step 4: Build the Dependency Graph
|
|
53
|
+
|
|
54
|
+
For each task, identify:
|
|
55
|
+
- **What it depends on**: which tasks must complete before this one can start
|
|
56
|
+
- **What depends on it**: which tasks are blocked until this one finishes
|
|
57
|
+
|
|
58
|
+
Tasks with no dependencies form Wave 1. Tasks whose dependencies are all in Wave 1 form Wave 2. And so on. All tasks within a wave can execute in parallel.
|
|
59
|
+
|
|
60
|
+
When assigning waves, verify that tasks within the same wave do not modify overlapping files. If two tasks in the same wave would touch the same file, move one to a later wave — parallel agents on the same branch cannot safely modify the same file.
|
|
61
|
+
|
|
62
|
+
### Step 5: Create the Spec Folder
|
|
63
|
+
|
|
64
|
+
Create the following structure at `specs/{feature-name}/`:
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
specs/{feature-name}/
|
|
68
|
+
├── README.md
|
|
69
|
+
├── requirements.md
|
|
70
|
+
├── action-required.md
|
|
71
|
+
└── tasks/
|
|
72
|
+
├── task-01-{name}.md
|
|
73
|
+
├── task-02-{name}.md
|
|
74
|
+
└── ...
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Read the templates in `references/` before writing each file:
|
|
78
|
+
- `references/readme-template.md` — for the README (dependency graph, wave table, status tracking)
|
|
79
|
+
- `references/task-template.md` — for each task file (self-contained with all context)
|
|
80
|
+
- `references/requirements-template.md` — for the requirements document
|
|
81
|
+
- `references/action-required-template.md` — for manual human steps
|
|
82
|
+
|
|
83
|
+
Task files are numbered with zero-padded two-digit prefixes in topological order: Wave 1 tasks first, then Wave 2, etc. Within a wave, order is arbitrary but stable.
|
|
84
|
+
|
|
85
|
+
### Step 6: Write Self-Contained Task Files
|
|
86
|
+
|
|
87
|
+
This is the most important step. Each task file is the **only thing** a coder agent will read before implementing. It must contain everything the agent needs:
|
|
88
|
+
|
|
89
|
+
- **Description**: what to build and why it matters in context
|
|
90
|
+
- **Dependency context**: what prior tasks produce that this task needs (summarized in prose, not just filenames). The agent should not need to read other task files.
|
|
91
|
+
- **Technical details**: CLI commands, code snippets, schemas, file paths, env vars, API endpoints — every implementation-specific detail from the planning conversation
|
|
92
|
+
- **Files to create/modify**: explicit list with purpose for each
|
|
93
|
+
- **Acceptance criteria**: specific, verifiable conditions
|
|
94
|
+
|
|
95
|
+
Review each task file with fresh eyes: could an agent who has never seen the planning conversation implement this correctly using only this file? If not, add what's missing.
|
|
96
|
+
|
|
97
|
+
### Step 7: Extract Manual Actions
|
|
98
|
+
|
|
99
|
+
Identify any steps that require human action (account creation, API key setup, DNS configuration, environment variables, third-party service registration, etc.). Write these to `action-required.md` grouped by timing (Before/During/After implementation). If none exist, note "No manual steps required."
|
|
100
|
+
|
|
101
|
+
### Step 8: Report to User
|
|
102
|
+
|
|
103
|
+
After creating the spec, display:
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
Feature specification created at specs/{feature-name}/
|
|
107
|
+
|
|
108
|
+
Files created:
|
|
109
|
+
- README.md (dependency graph, {N} waves, {T} tasks)
|
|
110
|
+
- requirements.md
|
|
111
|
+
- action-required.md
|
|
112
|
+
- tasks/ ({T} task files)
|
|
113
|
+
|
|
114
|
+
Wave breakdown:
|
|
115
|
+
- Wave 1: {count} tasks (parallel) — {brief description}
|
|
116
|
+
- Wave 2: {count} tasks (parallel) — {brief description}
|
|
117
|
+
- ...
|
|
118
|
+
|
|
119
|
+
Next steps:
|
|
120
|
+
1. Review action-required.md for tasks you need to complete manually
|
|
121
|
+
2. Review the requirements and task files
|
|
122
|
+
3. Use /implement-feature to start parallel implementation
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Critical Rules
|
|
126
|
+
|
|
127
|
+
- Every task file must be fully self-contained — this is the entire point of the spec structure. A coder agent reading only that file must know exactly what to do.
|
|
128
|
+
- Capture ALL technical details from the planning conversation. The spec is the single source of truth — CLI commands, schemas, code snippets, file paths, env vars, API endpoints. Anything not captured here is lost.
|
|
129
|
+
- Tasks within the same wave must not modify overlapping files. Parallel agents on the same branch cannot safely touch the same files.
|
|
130
|
+
- Keep tasks atomic — one concern per task. If a task has more than 5-7 files to modify, consider splitting it.
|
|
131
|
+
- Do not create testing tasks unless the user explicitly asks for them.
|
|
132
|
+
- Number task files in topological order (wave 1 first, then wave 2, etc.) for easy scanning.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Action Required Template
|
|
2
|
+
|
|
3
|
+
Use this structure for the action-required.md at the root of each spec folder. This file captures manual steps that require human action and cannot be automated by agents.
|
|
4
|
+
|
|
5
|
+
## Template (when manual steps exist)
|
|
6
|
+
|
|
7
|
+
```markdown
|
|
8
|
+
# Action Required: {Feature Name}
|
|
9
|
+
|
|
10
|
+
Manual steps that must be completed by a human. These cannot be automated.
|
|
11
|
+
|
|
12
|
+
## Before Implementation
|
|
13
|
+
|
|
14
|
+
- [ ] **{Action}** — {Brief reason why this is needed}
|
|
15
|
+
- [ ] **{Action}** — {Brief reason}
|
|
16
|
+
|
|
17
|
+
## During Implementation
|
|
18
|
+
|
|
19
|
+
- [ ] **{Action}** — {Brief reason}
|
|
20
|
+
|
|
21
|
+
## After Implementation
|
|
22
|
+
|
|
23
|
+
- [ ] **{Action}** — {Brief reason}
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
> These tasks are also referenced in context within the relevant task files.
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Template (when no manual steps exist)
|
|
31
|
+
|
|
32
|
+
```markdown
|
|
33
|
+
# Action Required: {Feature Name}
|
|
34
|
+
|
|
35
|
+
No manual steps required for this feature. All tasks can be implemented automatically.
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Common Manual Steps
|
|
39
|
+
|
|
40
|
+
- Account creation (third-party services, OAuth apps)
|
|
41
|
+
- API key generation and setup
|
|
42
|
+
- Environment variable configuration
|
|
43
|
+
- DNS or domain settings
|
|
44
|
+
- Billing or subscription setup
|
|
45
|
+
- Third-party service registration (webhooks, integrations)
|
|
46
|
+
- Certificate provisioning
|
|
47
|
+
- Access permissions or IAM roles
|
|
48
|
+
|
|
49
|
+
## Key Points
|
|
50
|
+
|
|
51
|
+
- Group actions by timing: before, during, and after implementation. This helps the user know when they need to act.
|
|
52
|
+
- Keep descriptions brief — one line explaining what to do and why.
|
|
53
|
+
- Also reference these manual steps in the relevant task files so agents know to pause or skip that part.
|