@1aboveio/skills 0.10.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/LICENSE +3 -0
- package/README.md +90 -0
- package/bin/1aboveio-skills.mjs +18 -0
- package/package.json +28 -0
- package/runtime/skills/distribution/generated/recipes.json +1189 -0
- package/runtime/skills/distribution/scripts/bundles.mjs +280 -0
- package/runtime/skills/engineering/engineering-runtime/scripts/main-module.mjs +80 -0
- package/skills/backend/airflow-dag-develop/LICENSE +3 -0
- package/skills/backend/airflow-dag-develop/SKILL.md +111 -0
- package/skills/backend/app-debug/LICENSE +3 -0
- package/skills/backend/app-debug/SKILL.md +109 -0
- package/skills/backend/app-debug/references/common-errors.md +128 -0
- package/skills/backend/python-backend/LICENSE +3 -0
- package/skills/backend/python-backend/SKILL.md +326 -0
- package/skills/cicd-pipeline/cloud-build/LICENSE +3 -0
- package/skills/cicd-pipeline/cloud-build/SKILL.md +707 -0
- package/skills/cicd-pipeline/cloud-debug/LICENSE +3 -0
- package/skills/cicd-pipeline/cloud-debug/SKILL.md +316 -0
- package/skills/cicd-pipeline/cloud-debug/references/build-failures.md +238 -0
- package/skills/cicd-pipeline/cloud-debug/references/deploy-failures.md +376 -0
- package/skills/cicd-pipeline/cloud-debug/references/pipeline-failures.md +378 -0
- package/skills/cicd-pipeline/cloud-deploy/LICENSE +3 -0
- package/skills/cicd-pipeline/cloud-deploy/SKILL.md +229 -0
- package/skills/cicd-pipeline/cloud-deploy/references/config-templates.md +257 -0
- package/skills/cicd-pipeline/docker/LICENSE +3 -0
- package/skills/cicd-pipeline/docker/SKILL.md +126 -0
- package/skills/cicd-pipeline/google-cloud/LICENSE +3 -0
- package/skills/cicd-pipeline/google-cloud/SKILL.md +118 -0
- package/skills/cicd-pipeline/google-cloud/references/gcs.md +469 -0
- package/skills/cicd-pipeline/google-cloud/references/iam.md +451 -0
- package/skills/cicd-pipeline/google-cloud/references/project.md +349 -0
- package/skills/cicd-pipeline/google-cloud/references/secrets.md +336 -0
- package/skills/cicd-pipeline/google-cloud/references/vpc.md +312 -0
- package/skills/cicd-pipeline/google-cloud/scripts/create-sa.sh +36 -0
- package/skills/cicd-pipeline/google-cloud/scripts/gcp-config.sh +31 -0
- package/skills/cicd-pipeline/google-cloud/scripts/grant-iap.sh +41 -0
- package/skills/cicd-pipeline/google-cloud/scripts/setup-secrets.sh +48 -0
- package/skills/cicd-pipeline/mergify/LICENSE +3 -0
- package/skills/cicd-pipeline/mergify/SKILL.md +138 -0
- package/skills/cicd-pipeline/mergify/assets/templates/mergify.yml +237 -0
- package/skills/cicd-pipeline/mergify/assets/templates/ruleset.json +46 -0
- package/skills/cicd-pipeline/mergify/references/branch-protection.md +277 -0
- package/skills/cicd-pipeline/mergify/references/configuration.md +183 -0
- package/skills/cicd-pipeline/mergify/references/diagnosis.md +73 -0
- package/skills/cicd-pipeline/mergify/references/traps.md +78 -0
- package/skills/cicd-pipeline/mergify/references/watch-contract.md +218 -0
- package/skills/cicd-pipeline/mergify/scripts/audit-core.mjs +131 -0
- package/skills/cicd-pipeline/mergify/scripts/audit.mjs +4 -0
- package/skills/cicd-pipeline/mergify/scripts/watch-pr-delivery-core.mjs +663 -0
- package/skills/cicd-pipeline/mergify/scripts/watch-pr-delivery.mjs +4 -0
- package/skills/cicd-pipeline/podman/LICENSE +3 -0
- package/skills/cicd-pipeline/podman/SKILL.md +70 -0
- package/skills/cicd-pipeline/podman/agents/openai.yaml +4 -0
- package/skills/cicd-pipeline/podman/assets/templates/podman-compose-socket-directory.yml +6 -0
- package/skills/cicd-pipeline/podman/assets/templates/podman-service-override.conf +3 -0
- package/skills/cicd-pipeline/podman/references/compose-compatibility.md +70 -0
- package/skills/cicd-pipeline/podman/references/networking-and-ports.md +74 -0
- package/skills/cicd-pipeline/podman/references/rootless-services-and-sockets.md +156 -0
- package/skills/cicd-pipeline/podman/references/troubleshooting.md +98 -0
- package/skills/engineering/e2e-test/LICENSE +3 -0
- package/skills/engineering/e2e-test/SKILL.md +156 -0
- package/skills/engineering/e2e-test/assets/ci-gates.cloudbuild.yaml +272 -0
- package/skills/engineering/e2e-test/assets/ci-gates.github.yml +451 -0
- package/skills/engineering/e2e-test/assets/e2e-workflow.yml +282 -0
- package/skills/engineering/e2e-test/references/authoring/auth-flows.md +159 -0
- package/skills/engineering/e2e-test/references/authoring/playwright-config.md +71 -0
- package/skills/engineering/e2e-test/references/authoring/playwright-patterns.md +219 -0
- package/skills/engineering/e2e-test/references/authoring/test-skipping.md +44 -0
- package/skills/engineering/e2e-test/references/ci-integration.md +121 -0
- package/skills/engineering/e2e-test/references/ci-playwright-container.md +280 -0
- package/skills/engineering/e2e-test/references/debugging.md +36 -0
- package/skills/engineering/e2e-test/references/presentation-sweep.md +131 -0
- package/skills/engineering/e2e-test/references/reviewing.md +39 -0
- package/skills/engineering/e2e-test/references/route-discovery.md +50 -0
- package/skills/engineering/e2e-test/references/route-manifest.md +44 -0
- package/skills/engineering/e2e-test/scripts/detect-routes-fastapi.py +290 -0
- package/skills/engineering/e2e-test/scripts/detect-routes-nextjs.mjs +200 -0
- package/skills/engineering/e2e-test/scripts/post-visual-evidence.mjs +158 -0
- package/skills/engineering/e2e-test/scripts/presentation-checks.mjs +171 -0
- package/skills/engineering/e2e-test/scripts/presentation-perceivability.mjs +179 -0
- package/skills/engineering/e2e-test/scripts/presentation-reachability.mjs +154 -0
- package/skills/engineering/e2e-test/scripts/presentation-render-health.mjs +141 -0
- package/skills/engineering/e2e-test/scripts/presentation-sweep.mjs +148 -0
- package/skills/engineering/e2e-test/scripts/presentation-temporal.mjs +127 -0
- package/skills/engineering/e2e-test/scripts/presentation-visual.mjs +84 -0
- package/skills/engineering/e2e-test/scripts/project-route-manifest.mjs +75 -0
- package/skills/engineering/e2e-test/scripts/validate-manifest.mjs +106 -0
- package/skills/engineering/engineering-runtime/LICENSE +3 -0
- package/skills/engineering/engineering-runtime/SKILL.md +10 -0
- package/skills/engineering/engineering-runtime/agents/openai.yaml +6 -0
- package/skills/engineering/engineering-runtime/coherence/workflow.json +553 -0
- package/skills/engineering/engineering-runtime/scripts/exact-head-artifact.mjs +131 -0
- package/skills/engineering/engineering-runtime/scripts/head-check-set.mjs +398 -0
- package/skills/engineering/engineering-runtime/scripts/main-module.mjs +80 -0
- package/skills/engineering/engineering-runtime/scripts/mergify-yaml.mjs +11 -0
- package/skills/engineering/engineering-runtime/scripts/package-lock.json +43 -0
- package/skills/engineering/engineering-runtime/scripts/package.json +10 -0
- package/skills/engineering/engineering-runtime/scripts/required-check-plan.mjs +223 -0
- package/skills/engineering/engineering-runtime/scripts/workflow-coherence.mjs +576 -0
- package/skills/engineering/engineering-runtime/scripts/workflow-policy.mjs +166 -0
- package/skills/engineering/ensure-coverage/LICENSE +3 -0
- package/skills/engineering/ensure-coverage/SKILL.md +136 -0
- package/skills/engineering/ensure-coverage/evals/evals.json +125 -0
- package/skills/engineering/ensure-coverage/references/breadth/coverage-ledger.md +91 -0
- package/skills/engineering/ensure-coverage/references/breadth/inventory-contract.md +83 -0
- package/skills/engineering/ensure-coverage/references/breadth/surface-baseline.md +44 -0
- package/skills/engineering/ensure-coverage/references/breadth/surface-discovery.md +16 -0
- package/skills/engineering/ensure-coverage/references/depth/characterization.md +68 -0
- package/skills/engineering/ensure-coverage/references/depth/coverage.config.example.json +25 -0
- package/skills/engineering/ensure-coverage/references/depth/grading.md +35 -0
- package/skills/engineering/ensure-coverage/references/depth/mock-policy.md +87 -0
- package/skills/engineering/ensure-coverage/references/depth/test-smells.md +23 -0
- package/skills/engineering/ensure-coverage/references/enforcement/ci-contract.md +164 -0
- package/skills/engineering/ensure-coverage/references/enforcement/hooks.md +85 -0
- package/skills/engineering/ensure-coverage/references/examples/coverage-ledger.md +109 -0
- package/skills/engineering/ensure-coverage/references/examples/refund-flow.md +33 -0
- package/skills/engineering/ensure-coverage/references/presentation/axis.md +78 -0
- package/skills/engineering/ensure-coverage/references/presentation/runner-contract.md +74 -0
- package/skills/engineering/ensure-coverage/references/process/audit-mode.md +33 -0
- package/skills/engineering/ensure-coverage/references/process/output-template.md +139 -0
- package/skills/engineering/ensure-coverage/references/process/review-contract-template.md +119 -0
- package/skills/engineering/ensure-coverage/references/process/scope-class.md +178 -0
- package/skills/engineering/ensure-coverage/references/process/test-strategy.md +55 -0
- package/skills/engineering/ensure-coverage/schemas/coverage-config.schema.json +45 -0
- package/skills/engineering/ensure-coverage/schemas/coverage-file.schema.json +93 -0
- package/skills/engineering/ensure-coverage/scripts/adapters/nextjs-inventory.mjs +178 -0
- package/skills/engineering/ensure-coverage/scripts/check-quarantine-expiry.mjs +101 -0
- package/skills/engineering/ensure-coverage/scripts/ci-audit.mjs +358 -0
- package/skills/engineering/ensure-coverage/scripts/coverage-checklist.mjs +494 -0
- package/skills/engineering/ensure-coverage/scripts/coverage-ledger.mjs +663 -0
- package/skills/engineering/ensure-coverage/scripts/design-parity.mjs +591 -0
- package/skills/engineering/ensure-coverage/scripts/evidence-block.mjs +367 -0
- package/skills/engineering/ensure-coverage/scripts/lint-tests.mjs +269 -0
- package/skills/engineering/ensure-coverage/scripts/mock-policy-config.mjs +176 -0
- package/skills/engineering/ensure-coverage/scripts/package-lock.json +76 -0
- package/skills/engineering/ensure-coverage/scripts/package.json +19 -0
- package/skills/engineering/ensure-coverage/scripts/scope-class.mjs +554 -0
- package/skills/engineering/harness-runtime/LICENSE +3 -0
- package/skills/engineering/harness-runtime/SKILL.md +18 -0
- package/skills/engineering/harness-runtime/agents/openai.yaml +6 -0
- package/skills/engineering/harness-runtime/bin/discover-models.mjs +4 -0
- package/skills/engineering/harness-runtime/bin/model-catalog.mjs +4 -0
- package/skills/engineering/harness-runtime/contracts.md +15 -0
- package/skills/engineering/harness-runtime/discover-models.mjs +392 -0
- package/skills/engineering/harness-runtime/fixtures/native-question-schemas.json +33 -0
- package/skills/engineering/harness-runtime/fixtures/question-responses.json +54 -0
- package/skills/engineering/harness-runtime/index.mjs +767 -0
- package/skills/engineering/harness-runtime/model-catalog.mjs +787 -0
- package/skills/engineering/harness-runtime/native-question-contracts.md +37 -0
- package/skills/engineering/harness-runtime/references/model-catalog-seed.json +159 -0
- package/skills/engineering/harness-runtime/references/model-catalog.md +57 -0
- package/skills/engineering/implement-and-pr/LICENSE +3 -0
- package/skills/engineering/implement-and-pr/SKILL.md +176 -0
- package/skills/engineering/implement-and-pr/references/ci-iteration.md +10 -0
- package/skills/engineering/implement-and-pr/references/closeout.md +27 -0
- package/skills/engineering/implement-and-pr/references/contract-complete-fix-rounds.md +34 -0
- package/skills/engineering/implement-and-pr/references/evidence-rules.md +39 -0
- package/skills/engineering/implement-and-pr/references/incremental-plan.md +16 -0
- package/skills/engineering/implement-and-pr/references/self-review.md +23 -0
- package/skills/engineering/implement-and-pr/references/tdd-mode.md +18 -0
- package/skills/engineering/resolve-issues/LICENSE +3 -0
- package/skills/engineering/resolve-issues/SKILL.md +167 -0
- package/skills/engineering/resolve-issues/generated/workflow-repair-policy.json +448 -0
- package/skills/engineering/resolve-issues/references/breaker.md +82 -0
- package/skills/engineering/resolve-issues/references/deliverables.md +27 -0
- package/skills/engineering/resolve-issues/references/delivery.md +108 -0
- package/skills/engineering/resolve-issues/references/evidence-lane.md +21 -0
- package/skills/engineering/resolve-issues/references/exact-head-ci.md +287 -0
- package/skills/engineering/resolve-issues/references/fan-out.md +33 -0
- package/skills/engineering/resolve-issues/references/finalization.md +68 -0
- package/skills/engineering/resolve-issues/references/guarantees.md +10 -0
- package/skills/engineering/resolve-issues/references/high-risk.md +29 -0
- package/skills/engineering/resolve-issues/references/incidents/848/README.md +156 -0
- package/skills/engineering/resolve-issues/references/intake.md +86 -0
- package/skills/engineering/resolve-issues/references/integration-gate.md +53 -0
- package/skills/engineering/resolve-issues/references/interference.md +87 -0
- package/skills/engineering/resolve-issues/references/loop.md +134 -0
- package/skills/engineering/resolve-issues/references/model-catalog.md +9 -0
- package/skills/engineering/resolve-issues/references/postmortem.md +27 -0
- package/skills/engineering/resolve-issues/references/pre-flight-model-slots.md +41 -0
- package/skills/engineering/resolve-issues/references/pre-flight-recording-and-checkout.md +48 -0
- package/skills/engineering/resolve-issues/references/pre-flight.md +41 -0
- package/skills/engineering/resolve-issues/references/regression-checklist.md +26 -0
- package/skills/engineering/resolve-issues/references/run-state.md +288 -0
- package/skills/engineering/resolve-issues/references/sandboxed-testing.md +48 -0
- package/skills/engineering/resolve-issues/references/spawn-contract.md +96 -0
- package/skills/engineering/resolve-issues/references/terminal-evidence-journal.md +40 -0
- package/skills/engineering/resolve-issues/references/why.md +653 -0
- package/skills/engineering/resolve-issues/schemas/fix-round.schema.json +49 -0
- package/skills/engineering/resolve-issues/scripts/combine-and-verify.mjs +721 -0
- package/skills/engineering/resolve-issues/scripts/component-candidate.mjs +962 -0
- package/skills/engineering/resolve-issues/scripts/contract-revision.mjs +220 -0
- package/skills/engineering/resolve-issues/scripts/detect-delivery-mode.mjs +420 -0
- package/skills/engineering/resolve-issues/scripts/detect-target-branch.mjs +256 -0
- package/skills/engineering/resolve-issues/scripts/detect-workspace-mode.mjs +168 -0
- package/skills/engineering/resolve-issues/scripts/discover-models.mjs +9 -0
- package/skills/engineering/resolve-issues/scripts/doctrine.mjs +62 -0
- package/skills/engineering/resolve-issues/scripts/evidence-lifecycle-contract.mjs +191 -0
- package/skills/engineering/resolve-issues/scripts/exact-head-ci.mjs +413 -0
- package/skills/engineering/resolve-issues/scripts/exact-head-github-provider.mjs +332 -0
- package/skills/engineering/resolve-issues/scripts/finalize.mjs +488 -0
- package/skills/engineering/resolve-issues/scripts/fix-rounds.mjs +3307 -0
- package/skills/engineering/resolve-issues/scripts/fixtures/evidence-lifecycle-circular-1001.json +16 -0
- package/skills/engineering/resolve-issues/scripts/fixtures/evidence-lifecycle-valid-sequencing.json +51 -0
- package/skills/engineering/resolve-issues/scripts/fixtures/fmm-express-830-component-candidate.json +17 -0
- package/skills/engineering/resolve-issues/scripts/fixtures/head-check-set-1081.json +166 -0
- package/skills/engineering/resolve-issues/scripts/gate-value-series.mjs +92 -0
- package/skills/engineering/resolve-issues/scripts/guide-index.mjs +73 -0
- package/skills/engineering/resolve-issues/scripts/head-check-set.mjs +159 -0
- package/skills/engineering/resolve-issues/scripts/interference.mjs +427 -0
- package/skills/engineering/resolve-issues/scripts/model-catalog.mjs +9 -0
- package/skills/engineering/resolve-issues/scripts/next-operations.mjs +419 -0
- package/skills/engineering/resolve-issues/scripts/postmortem.mjs +909 -0
- package/skills/engineering/resolve-issues/scripts/preflight-questions.mjs +322 -0
- package/skills/engineering/resolve-issues/scripts/reconcile-contained-unit-prs.mjs +415 -0
- package/skills/engineering/resolve-issues/scripts/release-state-contract.mjs +697 -0
- package/skills/engineering/resolve-issues/scripts/report.mjs +494 -0
- package/skills/engineering/resolve-issues/scripts/required-check-plan.mjs +172 -0
- package/skills/engineering/resolve-issues/scripts/round-metadata.mjs +79 -0
- package/skills/engineering/resolve-issues/scripts/run-state-review6-cases.mjs +334 -0
- package/skills/engineering/resolve-issues/scripts/run-state.mjs +4784 -0
- package/skills/engineering/resolve-issues/scripts/sandbox-selftest.mjs +395 -0
- package/skills/engineering/resolve-issues/scripts/spawn-contract.mjs +290 -0
- package/skills/engineering/resolve-issues/scripts/terminal-dispositions.mjs +170 -0
- package/skills/engineering/resolve-issues/scripts/terminal-evidence-journal.mjs +293 -0
- package/skills/engineering/resolve-issues/scripts/unit-kind.mjs +197 -0
- package/skills/engineering/resolve-issues/scripts/unit-lifecycle.mjs +127 -0
- package/skills/engineering/resolve-issues/scripts/watch-delivery.mjs +893 -0
- package/skills/engineering/resolve-issues/scripts/workspaces.mjs +829 -0
- package/skills/engineering/resolve-issues/workflows/independent-review.workflow.js +290 -0
- package/skills/engineering/resolve-issues/workflows/prior-art-scan.workflow.js +80 -0
- package/skills/engineering/resolve-issues/workflows/workflow-smoke.mjs +102 -0
- package/skills/engineering/resolve-release/LICENSE +3 -0
- package/skills/engineering/resolve-release/SKILL.md +112 -0
- package/skills/engineering/resolve-release/references/assembly.md +137 -0
- package/skills/engineering/resolve-release/references/auto-when-green.md +56 -0
- package/skills/engineering/resolve-release/references/candidate.md +167 -0
- package/skills/engineering/resolve-release/references/exposure.md +178 -0
- package/skills/engineering/resolve-release/references/handoff.md +24 -0
- package/skills/engineering/resolve-release/references/postmortem.md +230 -0
- package/skills/engineering/resolve-release/references/preflight.md +207 -0
- package/skills/engineering/resolve-release/references/principles.md +94 -0
- package/skills/engineering/resolve-release/references/regression-checklist.md +36 -0
- package/skills/engineering/resolve-release/references/related-skills.md +12 -0
- package/skills/engineering/resolve-release/references/routing.md +149 -0
- package/skills/engineering/resolve-release/references/verified-sha-github-flow.md +285 -0
- package/skills/engineering/resolve-release/references/versioning.md +202 -0
- package/skills/engineering/resolve-release/references/why.md +53 -0
- package/skills/engineering/resolve-release/scripts/adapter-completion-artifact.mjs +389 -0
- package/skills/engineering/resolve-release/scripts/build-changes.mjs +209 -0
- package/skills/engineering/resolve-release/scripts/candidate-hygiene.mjs +407 -0
- package/skills/engineering/resolve-release/scripts/candidate-identity.mjs +904 -0
- package/skills/engineering/resolve-release/scripts/candidate-traffic.mjs +81 -0
- package/skills/engineering/resolve-release/scripts/checked-adapter-loader.mjs +612 -0
- package/skills/engineering/resolve-release/scripts/close-attempt.mjs +135 -0
- package/skills/engineering/resolve-release/scripts/closeout-release.mjs +161 -0
- package/skills/engineering/resolve-release/scripts/doctrine.mjs +106 -0
- package/skills/engineering/resolve-release/scripts/durable-processing.mjs +522 -0
- package/skills/engineering/resolve-release/scripts/ensure-target-green.mjs +659 -0
- package/skills/engineering/resolve-release/scripts/evidence-bundle.mjs +1014 -0
- package/skills/engineering/resolve-release/scripts/finalize-release.mjs +526 -0
- package/skills/engineering/resolve-release/scripts/fixtures/durable-processing-adapter.mjs +169 -0
- package/skills/engineering/resolve-release/scripts/green-gate.mjs +599 -0
- package/skills/engineering/resolve-release/scripts/isolated-adapter-evaluator.mjs +752 -0
- package/skills/engineering/resolve-release/scripts/metadata-pr-status.mjs +56 -0
- package/skills/engineering/resolve-release/scripts/metadata-sync.mjs +1538 -0
- package/skills/engineering/resolve-release/scripts/postmortem.mjs +381 -0
- package/skills/engineering/resolve-release/scripts/preflight-probes.mjs +498 -0
- package/skills/engineering/resolve-release/scripts/production-endpoints.mjs +326 -0
- package/skills/engineering/resolve-release/scripts/rc-circuit-breaker.mjs +272 -0
- package/skills/engineering/resolve-release/scripts/report.mjs +417 -0
- package/skills/engineering/resolve-release/scripts/reprobe-credentials.mjs +114 -0
- package/skills/engineering/resolve-release/scripts/revalidate-candidate.mjs +238 -0
- package/skills/engineering/resolve-release/scripts/review-packet.mjs +503 -0
- package/skills/engineering/resolve-release/scripts/rollback-floor.mjs +263 -0
- package/skills/engineering/resolve-release/scripts/version-assert.mjs +339 -0
- package/skills/engineering/resolve-release/scripts/version-postmortem.mjs +485 -0
- package/skills/engineering/resolve-release/scripts/version.mjs +1199 -0
- package/skills/engineering/resolve-release/scripts/watch-candidate-delivery.mjs +449 -0
- package/skills/engineering/resolve-release/vendor/ACORN-LICENSE +21 -0
- package/skills/engineering/resolve-release/vendor/README.md +60 -0
- package/skills/engineering/resolve-release/vendor/acorn.mjs +6233 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/LICENSE +21 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/README.md +341 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/README.template.md +70 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-TAV5CUKK.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-TAV5CUKK.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-V2S4ZYJR.mjs +7 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-V2S4ZYJR.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.d.mts +2033 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.d.ts +2033 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.js +7 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.js.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-ES6BEMUI.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-ES6BEMUI.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-asyncify-2EFITU5U.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-asyncify-2EFITU5U.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/package.json +49 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/LICENSE +21 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/README.md +5 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.d.mts +549 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.d.ts +549 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.js +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.js.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/package.json +36 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/LICENSE +47 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/README.md +82 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.browser.d.ts +11 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.browser.mjs +22 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cjs +21 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cloudflare.cjs +21 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cloudflare.d.ts +11 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.d.ts +11 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.mjs +25 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.wasm +0 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.d.mts +85 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.d.ts +85 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.js +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.js.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.d.mts +20 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.d.ts +20 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.js +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.js.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/package.json +61 -0
- package/skills/engineering/review-pr/LICENSE +3 -0
- package/skills/engineering/review-pr/SKILL.md +123 -0
- package/skills/engineering/review-pr/references/adversarial-reviewer-prompt.md +42 -0
- package/skills/engineering/review-pr/references/code-correctness.md +5 -0
- package/skills/engineering/review-pr/references/contract-freshness.md +9 -0
- package/skills/engineering/review-pr/references/coordination.md +18 -0
- package/skills/engineering/review-pr/references/domain-hazards.md +123 -0
- package/skills/engineering/review-pr/references/finding-themes.md +7 -0
- package/skills/engineering/review-pr/references/github-posting.md +98 -0
- package/skills/engineering/review-pr/references/golden-path-smoke.md +5 -0
- package/skills/engineering/review-pr/references/incremental-output.md +16 -0
- package/skills/engineering/review-pr/references/inputs-and-discovery.md +31 -0
- package/skills/engineering/review-pr/references/output-format.md +99 -0
- package/skills/engineering/review-pr/references/over-mock-screen.md +7 -0
- package/skills/engineering/review-pr/references/promotion-prs.md +16 -0
- package/skills/engineering/review-pr/references/re-review.md +18 -0
- package/skills/engineering/review-pr/references/review-method.md +199 -0
- package/skills/engineering/review-pr/references/review-mode.md +30 -0
- package/skills/engineering/review-pr/references/review-posture.md +53 -0
- package/skills/engineering/review-pr/references/round1-depth.md +62 -0
- package/skills/engineering/review-pr/references/scripts.md +17 -0
- package/skills/engineering/review-pr/references/workflow.md +16 -0
- package/skills/engineering/review-pr/schemas/findings.schema.json +282 -0
- package/skills/engineering/review-pr/scripts/finding-contract.mjs +285 -0
- package/skills/engineering/review-pr/scripts/post-review.mjs +405 -0
- package/skills/engineering/review-pr/scripts/pr-context.mjs +207 -0
- package/skills/engineering/review-pr/scripts/scan-diff.mjs +365 -0
- package/skills/engineering/review-pr/scripts/theme-contract.mjs +57 -0
- package/skills/engineering/smoke/LICENSE +3 -0
- package/skills/engineering/smoke/SKILL.md +131 -0
- package/skills/engineering/smoke/assets/smoke.manifest.example.json +53 -0
- package/skills/engineering/smoke/references/manifest.md +192 -0
- package/skills/engineering/smoke/scripts/smoke.mjs +713 -0
- package/skills/fullstack/better-auth/LICENSE +3 -0
- package/skills/fullstack/better-auth/SKILL.md +601 -0
- package/skills/fullstack/better-auth/references/feishu-api.md +270 -0
- package/skills/fullstack/monorepo/LICENSE +3 -0
- package/skills/fullstack/monorepo/SKILL.md +465 -0
- package/skills/fullstack/nextjs-fullstack/LICENSE +3 -0
- package/skills/fullstack/nextjs-fullstack/SKILL.md +210 -0
- package/skills/fullstack/nextjs-fullstack/conventions.md +318 -0
- package/skills/fullstack/nextjs-fullstack/frontend-conventions.md +61 -0
- package/skills/fullstack/nextjs-fullstack/nextjs16.md +287 -0
- package/skills/fullstack/nextjs-fullstack/server-actions.md +409 -0
- package/skills/fullstack/prisma-setup/LICENSE +3 -0
- package/skills/fullstack/prisma-setup/SKILL.md +180 -0
- package/skills/fullstack/prisma-setup/nextjs.md +258 -0
- package/skills/fullstack/prisma-setup/turborepo.md +301 -0
- package/skills/fullstack/shadcn/LICENSE +3 -0
- package/skills/fullstack/shadcn/SKILL.md +119 -0
- package/skills/fullstack/shadcn/assets/shadcn-small.png +0 -0
- package/skills/fullstack/shadcn/assets/shadcn.png +0 -0
- package/skills/fullstack/shadcn/cli.md +411 -0
- package/skills/fullstack/shadcn/customization.md +224 -0
- package/skills/fullstack/shadcn/evals/evals.json +90 -0
- package/skills/fullstack/shadcn/mcp.md +101 -0
- package/skills/fullstack/shadcn/rules/base-vs-radix.md +323 -0
- package/skills/fullstack/shadcn/rules/component-selection.md +67 -0
- package/skills/fullstack/shadcn/rules/composition.md +195 -0
- package/skills/fullstack/shadcn/rules/data-table.md +201 -0
- package/skills/fullstack/shadcn/rules/forms.md +255 -0
- package/skills/fullstack/shadcn/rules/icons.md +103 -0
- package/skills/fullstack/shadcn/rules/styling.md +167 -0
- package/skills/fullstack/zod-v4/LICENSE +3 -0
- package/skills/fullstack/zod-v4/SKILL.md +287 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "shadcn",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "I'm building a Next.js app with shadcn/ui (base-nova preset, lucide icons). Create a settings form component with fields for: full name, email address, and notification preferences (email, SMS, push notifications as toggle options). Add validation states for required fields.",
|
|
7
|
+
"expected_output": "A React component using FieldGroup, Field, ToggleGroup, data-invalid/aria-invalid validation, gap-* spacing, and semantic colors.",
|
|
8
|
+
"files": [],
|
|
9
|
+
"expectations": [
|
|
10
|
+
"Uses FieldGroup and Field components for form layout instead of raw div with space-y",
|
|
11
|
+
"Uses Switch for independent on/off notification toggles (not looping Button with manual active state)",
|
|
12
|
+
"Uses data-invalid on Field and aria-invalid on the input control for validation states",
|
|
13
|
+
"Uses gap-* (e.g. gap-4, gap-6) instead of space-y-* or space-x-* for spacing",
|
|
14
|
+
"Uses semantic color tokens (e.g. bg-background, text-muted-foreground, text-destructive) instead of raw colors like bg-red-500",
|
|
15
|
+
"No manual dark: color overrides"
|
|
16
|
+
]
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"id": 2,
|
|
20
|
+
"prompt": "Create a dialog component for editing a user profile. It should have the user's avatar at the top, input fields for name and bio, and Save/Cancel buttons with appropriate icons. Using shadcn/ui with radix-nova preset and tabler icons.",
|
|
21
|
+
"expected_output": "A React component with DialogTitle, Avatar+AvatarFallback, data-icon on icon buttons, no icon sizing classes, tabler icon imports.",
|
|
22
|
+
"files": [],
|
|
23
|
+
"expectations": [
|
|
24
|
+
"Includes DialogTitle for accessibility (visible or with sr-only class)",
|
|
25
|
+
"Avatar component includes AvatarFallback",
|
|
26
|
+
"Icons on buttons use the data-icon attribute (data-icon=\"inline-start\" or data-icon=\"inline-end\")",
|
|
27
|
+
"No sizing classes on icons inside components (no size-4, w-4, h-4, etc.)",
|
|
28
|
+
"Uses tabler icons (@tabler/icons-react) instead of lucide-react",
|
|
29
|
+
"Uses asChild for custom triggers (radix preset)"
|
|
30
|
+
]
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": 3,
|
|
34
|
+
"prompt": "Create a dashboard component that shows 4 stat cards in a grid. Each card has a title, large number, percentage change badge, and a loading skeleton state. Using shadcn/ui with base-nova preset and lucide icons.",
|
|
35
|
+
"expected_output": "A React component with full Card composition, Skeleton for loading, Badge for changes, semantic colors, gap-* spacing.",
|
|
36
|
+
"files": [],
|
|
37
|
+
"expectations": [
|
|
38
|
+
"Uses full Card composition with CardHeader, CardTitle, CardContent (not dumping everything into CardContent)",
|
|
39
|
+
"Uses Skeleton component for loading placeholders instead of custom animate-pulse divs",
|
|
40
|
+
"Uses Badge component for percentage change instead of custom styled spans",
|
|
41
|
+
"Uses semantic color tokens instead of raw color values like bg-green-500 or text-red-600",
|
|
42
|
+
"Uses gap-* instead of space-y-* or space-x-* for spacing",
|
|
43
|
+
"Uses size-* when width and height are equal instead of separate w-* h-*"
|
|
44
|
+
]
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"id": 4,
|
|
48
|
+
"prompt": "Our signup form needs real validation. It's a Next.js App Router app on shadcn (radix-nova, lucide). Fields are email, password, confirm password. We use react-hook-form with a zod resolver. When a field fails, show the message under it in red, and make sure screen readers actually announce it — our a11y audit flagged that our current form errors are silent.",
|
|
49
|
+
"expected_output": "A client component using FieldGroup/Field, FieldError (not FieldDescription) for messages, data-invalid on Field and aria-invalid on the control driven from formState.errors.",
|
|
50
|
+
"files": [],
|
|
51
|
+
"expectations": [
|
|
52
|
+
"Error messages render in FieldError, not FieldDescription",
|
|
53
|
+
"Does not hand-roll an error element such as a <p className=\"text-destructive\"> or a custom role=alert div",
|
|
54
|
+
"Field receives data-invalid driven from the form's error state",
|
|
55
|
+
"The control receives aria-invalid driven from the same error state",
|
|
56
|
+
"Uses FieldGroup + Field for layout rather than div with space-y-* or grid gap-*",
|
|
57
|
+
"Includes the \"use client\" directive, since react-hook-form needs client-side state"
|
|
58
|
+
]
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"id": 5,
|
|
62
|
+
"prompt": "I need a /admin/orders page in our Next.js App Router app (shadcn radix-nova, pnpm, lucide icons). It has to list orders with filtering by status, sorting by date and total, and pagination — and the filters need to survive a refresh and be shareable as a link, because support staff paste these URLs to each other. Orders table is big, ~400k rows, so it can't all come down to the browser.",
|
|
63
|
+
"expected_output": "Installs the DiceUI data-table from a working registry URL, wires an RSC page that parses searchParams and queries server-side, and a client table component using useDataTable with a required pageCount.",
|
|
64
|
+
"files": [],
|
|
65
|
+
"expectations": [
|
|
66
|
+
"Any shadcn add command for the data table uses a registry URL ending in .json (an extensionless diceui.com/r/ URL 404s)",
|
|
67
|
+
"Passes pageCount to useDataTable rather than omitting it or relying on client-side pagination",
|
|
68
|
+
"Filtering, sorting and pagination are performed in the server query, not over an in-memory array of all rows",
|
|
69
|
+
"Filterable columns set enableColumnFilter: true and supply column meta (label/variant, plus options for select filters)",
|
|
70
|
+
"Wraps the app with NuqsAdapter or notes it is already required for URL state",
|
|
71
|
+
"The page component reads searchParams on the server; only the table component is a client component",
|
|
72
|
+
"Parses sort on the server with the shipped getSortingStateParser (or an equivalent nuqs loader) rather than treating the sort param as a plain field:asc string, since it is JSON-encoded",
|
|
73
|
+
"Flags or installs zod, which lib/parsers.ts imports but the registry item does not declare"
|
|
74
|
+
]
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"id": 6,
|
|
78
|
+
"prompt": "we're on shadcn and i customized components/ui/button.tsx a while back (added a 'warning' variant and tweaked the focus ring). upstream has moved on and i want the new button improvements without losing my changes. also we're switching the whole app off lucide to tabler icons. what's the safe way to do both?",
|
|
79
|
+
"expected_output": "Uses add --dry-run/--diff to review upstream changes and merge manually rather than --overwrite, and uses migrate icons --from lucide --to tabler rather than hand-editing imports.",
|
|
80
|
+
"files": [],
|
|
81
|
+
"expectations": [
|
|
82
|
+
"Uses shadcn add button --dry-run and/or --diff to inspect upstream changes before writing",
|
|
83
|
+
"Does not run --overwrite without flagging that local customizations would be lost and asking first",
|
|
84
|
+
"Does not fetch button.tsx from GitHub or any raw source URL to diff manually",
|
|
85
|
+
"Recommends shadcn migrate icons --from lucide --to tabler instead of manually rewriting import statements",
|
|
86
|
+
"Notes that iconLibrary in components.json should end up as tabler so future added components match"
|
|
87
|
+
]
|
|
88
|
+
}
|
|
89
|
+
]
|
|
90
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# shadcn MCP Server
|
|
2
|
+
|
|
3
|
+
The CLI includes an MCP server that lets AI assistants search, browse, view, and install components from registries.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Setup
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
shadcn mcp # start the MCP server (stdio)
|
|
11
|
+
shadcn mcp init # write config for your editor (prompts)
|
|
12
|
+
shadcn mcp init --client claude # claude | cursor | vscode | codex | opencode
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Editor config files:
|
|
16
|
+
|
|
17
|
+
| Editor | Config file |
|
|
18
|
+
|--------|------------|
|
|
19
|
+
| Claude Code | `.mcp.json` |
|
|
20
|
+
| Cursor | `.cursor/mcp.json` |
|
|
21
|
+
| VS Code | `.vscode/mcp.json` |
|
|
22
|
+
| OpenCode | `opencode.json` |
|
|
23
|
+
| Codex | `~/.codex/config.toml` (manual) |
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Tools
|
|
28
|
+
|
|
29
|
+
> **Tip:** MCP tools handle registry operations (search, view, install). For project configuration (aliases, framework, Tailwind version), use `npx shadcn@latest info` — there is no MCP equivalent.
|
|
30
|
+
|
|
31
|
+
### `shadcn:get_project_registries`
|
|
32
|
+
|
|
33
|
+
Returns registry names from `components.json`. Errors if no `components.json` exists.
|
|
34
|
+
|
|
35
|
+
**Input:** none
|
|
36
|
+
|
|
37
|
+
### `shadcn:list_items_in_registries`
|
|
38
|
+
|
|
39
|
+
Lists all items from one or more registries.
|
|
40
|
+
|
|
41
|
+
**Input:** `registries` (string[]), `types` (string[], optional — e.g. `ui`, `block`, `hook`), `limit` (number, optional), `offset` (number, optional)
|
|
42
|
+
|
|
43
|
+
### `shadcn:search_items_in_registries`
|
|
44
|
+
|
|
45
|
+
Fuzzy search across registries.
|
|
46
|
+
|
|
47
|
+
**Input:** `registries` (string[]), `query` (string), `types` (string[], optional), `limit` (number, optional), `offset` (number, optional)
|
|
48
|
+
|
|
49
|
+
### `shadcn:view_items_in_registries`
|
|
50
|
+
|
|
51
|
+
View item details including full file contents.
|
|
52
|
+
|
|
53
|
+
**Input:** `items` (string[]) — e.g. `["@shadcn/button", "@shadcn/card"]`
|
|
54
|
+
|
|
55
|
+
### `shadcn:get_item_examples_from_registries`
|
|
56
|
+
|
|
57
|
+
Find usage examples and demos with source code.
|
|
58
|
+
|
|
59
|
+
**Input:** `registries` (string[]), `query` (string) — e.g. `"accordion-demo"`, `"button example"`
|
|
60
|
+
|
|
61
|
+
### `shadcn:get_add_command_for_items`
|
|
62
|
+
|
|
63
|
+
Returns the CLI install command.
|
|
64
|
+
|
|
65
|
+
**Input:** `items` (string[]) — e.g. `["@shadcn/button"]`
|
|
66
|
+
|
|
67
|
+
### `shadcn:get_audit_checklist`
|
|
68
|
+
|
|
69
|
+
Returns a checklist for verifying components (imports, deps, lint, TypeScript).
|
|
70
|
+
|
|
71
|
+
**Input:** none
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Configuring Registries
|
|
76
|
+
|
|
77
|
+
Registries are set in `components.json`. The `@shadcn` registry is always built-in, as `https://ui.shadcn.com/r/styles/{style}/{name}.json`.
|
|
78
|
+
|
|
79
|
+
Prefer `npx shadcn@latest registry add @acme` (or `@acme=https://acme.com/r/{name}.json`) over hand-editing this object.
|
|
80
|
+
|
|
81
|
+
```json
|
|
82
|
+
{
|
|
83
|
+
"registries": {
|
|
84
|
+
"@acme": "https://acme.com/r/{name}.json",
|
|
85
|
+
"@private": {
|
|
86
|
+
"url": "https://private.com/r/{name}.json",
|
|
87
|
+
"params": { "version": "2" },
|
|
88
|
+
"headers": { "Authorization": "Bearer ${MY_TOKEN}" }
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
- Names must start with `@`.
|
|
95
|
+
- URLs must contain `{name}`. `{style}` is also substituted, from `components.json`'s `style` (the full `<base>-<preset>`, e.g. `radix-nova`) — only use it if the registry really is style-segmented, or resolution will 404.
|
|
96
|
+
- Object form supports `url` (required), `params` (query string), and `headers`.
|
|
97
|
+
- `${VAR}` references are resolved from environment variables.
|
|
98
|
+
|
|
99
|
+
Community registry index: `https://ui.shadcn.com/r/registries.json`. Verify a template from that index actually resolves before trusting it — some entries publish a `{style}` URL whose items don't exist per-style.
|
|
100
|
+
|
|
101
|
+
Validate a registry you author with `npx shadcn@latest registry validate`.
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
# Base vs Radix
|
|
2
|
+
|
|
3
|
+
API differences between `base` (Base UI) and `radix` (Radix UI). Check `config.base` from `npx shadcn@latest info`.
|
|
4
|
+
|
|
5
|
+
## Contents
|
|
6
|
+
|
|
7
|
+
- A third base: aria
|
|
8
|
+
- Composition: asChild vs render
|
|
9
|
+
- Button / trigger as non-button element
|
|
10
|
+
- Select (items prop, placeholder, positioning, multiple, object values)
|
|
11
|
+
- ToggleGroup (type vs multiple)
|
|
12
|
+
- Slider (scalar vs array)
|
|
13
|
+
- Accordion (type and defaultValue)
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## A third base: `aria`
|
|
18
|
+
|
|
19
|
+
`config.base` can also be **`aria`** — components built on Adobe's [React Aria](https://react-aria.adobe.com). It's selected at init with `npx shadcn@latest init --base aria` and stored in `components.json` as `style: "aria-<preset>"`.
|
|
20
|
+
|
|
21
|
+
The rules below are documented for `base` and `radix` only and **do not describe the aria API**. When a project's base is `aria`, don't extrapolate from either column — pull the real API first:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npx shadcn@latest docs button select --base aria
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Docs resolve to `https://ui.shadcn.com/docs/components/aria/<component>`, with an `api` link into the React Aria reference.
|
|
28
|
+
|
|
29
|
+
One aria-specific trap worth carrying: **don't use `<Button>` for links.** React Aria's `Button` always applies `role="button"`, which overrides the link semantics of an `<a>`. Use the `buttonVariants` helper on a plain `<a>` instead.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Composition: asChild (radix) vs render (base)
|
|
34
|
+
|
|
35
|
+
Radix uses `asChild` to replace the default element. Base uses `render`. Don't wrap triggers in extra elements.
|
|
36
|
+
|
|
37
|
+
**Incorrect:**
|
|
38
|
+
|
|
39
|
+
```tsx
|
|
40
|
+
<DialogTrigger>
|
|
41
|
+
<div>
|
|
42
|
+
<Button>Open</Button>
|
|
43
|
+
</div>
|
|
44
|
+
</DialogTrigger>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**Correct (radix):**
|
|
48
|
+
|
|
49
|
+
```tsx
|
|
50
|
+
<DialogTrigger asChild>
|
|
51
|
+
<Button>Open</Button>
|
|
52
|
+
</DialogTrigger>
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**Correct (base):**
|
|
56
|
+
|
|
57
|
+
```tsx
|
|
58
|
+
<DialogTrigger render={<Button />}>Open</DialogTrigger>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
This applies to all trigger and close components: `DialogTrigger`, `SheetTrigger`, `AlertDialogTrigger`, `DropdownMenuTrigger`, `PopoverTrigger`, `TooltipTrigger`, `CollapsibleTrigger`, `DialogClose`, `SheetClose`, `NavigationMenuLink`, `BreadcrumbLink`, `SidebarMenuButton`, `Badge`, `Item`.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Button / trigger as non-button element (base only)
|
|
66
|
+
|
|
67
|
+
When `render` changes an element to a non-button (`<a>`, `<span>`), add `nativeButton={false}`.
|
|
68
|
+
|
|
69
|
+
**Incorrect (base):** missing `nativeButton={false}`.
|
|
70
|
+
|
|
71
|
+
```tsx
|
|
72
|
+
<Button render={<a href="/docs" />}>Read the docs</Button>
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Correct (base):**
|
|
76
|
+
|
|
77
|
+
```tsx
|
|
78
|
+
<Button render={<a href="/docs" />} nativeButton={false}>
|
|
79
|
+
Read the docs
|
|
80
|
+
</Button>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**Correct (radix):**
|
|
84
|
+
|
|
85
|
+
```tsx
|
|
86
|
+
<Button asChild>
|
|
87
|
+
<a href="/docs">Read the docs</a>
|
|
88
|
+
</Button>
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Same for triggers whose `render` is not a `Button`:
|
|
92
|
+
|
|
93
|
+
```tsx
|
|
94
|
+
// base.
|
|
95
|
+
<PopoverTrigger render={<InputGroupAddon />} nativeButton={false}>
|
|
96
|
+
Pick date
|
|
97
|
+
</PopoverTrigger>
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Select
|
|
103
|
+
|
|
104
|
+
**items prop (base only).** Base requires an `items` prop on the root. Radix uses inline JSX only.
|
|
105
|
+
|
|
106
|
+
**Incorrect (base):**
|
|
107
|
+
|
|
108
|
+
```tsx
|
|
109
|
+
<Select>
|
|
110
|
+
<SelectTrigger><SelectValue placeholder="Select a fruit" /></SelectTrigger>
|
|
111
|
+
</Select>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**Correct (base):**
|
|
115
|
+
|
|
116
|
+
```tsx
|
|
117
|
+
const items = [
|
|
118
|
+
{ label: "Select a fruit", value: null },
|
|
119
|
+
{ label: "Apple", value: "apple" },
|
|
120
|
+
{ label: "Banana", value: "banana" },
|
|
121
|
+
]
|
|
122
|
+
|
|
123
|
+
<Select items={items}>
|
|
124
|
+
<SelectTrigger>
|
|
125
|
+
<SelectValue />
|
|
126
|
+
</SelectTrigger>
|
|
127
|
+
<SelectContent>
|
|
128
|
+
<SelectGroup>
|
|
129
|
+
{items.map((item) => (
|
|
130
|
+
<SelectItem key={item.value} value={item.value}>{item.label}</SelectItem>
|
|
131
|
+
))}
|
|
132
|
+
</SelectGroup>
|
|
133
|
+
</SelectContent>
|
|
134
|
+
</Select>
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**Correct (radix):**
|
|
138
|
+
|
|
139
|
+
```tsx
|
|
140
|
+
<Select>
|
|
141
|
+
<SelectTrigger>
|
|
142
|
+
<SelectValue placeholder="Select a fruit" />
|
|
143
|
+
</SelectTrigger>
|
|
144
|
+
<SelectContent>
|
|
145
|
+
<SelectGroup>
|
|
146
|
+
<SelectItem value="apple">Apple</SelectItem>
|
|
147
|
+
<SelectItem value="banana">Banana</SelectItem>
|
|
148
|
+
</SelectGroup>
|
|
149
|
+
</SelectContent>
|
|
150
|
+
</Select>
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
**Placeholder.** Base uses a `{ value: null }` item in the items array. Radix uses `<SelectValue placeholder="...">`.
|
|
154
|
+
|
|
155
|
+
**Content positioning.** Base uses `alignItemWithTrigger`. Radix uses `position`.
|
|
156
|
+
|
|
157
|
+
```tsx
|
|
158
|
+
// base.
|
|
159
|
+
<SelectContent alignItemWithTrigger={false} side="bottom">
|
|
160
|
+
|
|
161
|
+
// radix.
|
|
162
|
+
<SelectContent position="popper">
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## Select — multiple selection and object values (base only)
|
|
168
|
+
|
|
169
|
+
Base supports `multiple`, render-function children on `SelectValue`, and object values with `itemToStringValue`. Radix is single-select with string values only.
|
|
170
|
+
|
|
171
|
+
**Correct (base — multiple selection):**
|
|
172
|
+
|
|
173
|
+
```tsx
|
|
174
|
+
<Select items={items} multiple defaultValue={[]}>
|
|
175
|
+
<SelectTrigger>
|
|
176
|
+
<SelectValue>
|
|
177
|
+
{(value: string[]) => value.length === 0 ? "Select fruits" : `${value.length} selected`}
|
|
178
|
+
</SelectValue>
|
|
179
|
+
</SelectTrigger>
|
|
180
|
+
...
|
|
181
|
+
</Select>
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
**Correct (base — object values):**
|
|
185
|
+
|
|
186
|
+
```tsx
|
|
187
|
+
<Select defaultValue={plans[0]} itemToStringValue={(plan) => plan.name}>
|
|
188
|
+
<SelectTrigger>
|
|
189
|
+
<SelectValue>{(value) => value.name}</SelectValue>
|
|
190
|
+
</SelectTrigger>
|
|
191
|
+
...
|
|
192
|
+
</Select>
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## ToggleGroup
|
|
198
|
+
|
|
199
|
+
Base uses a `multiple` boolean prop. Radix uses `type="single"` or `type="multiple"`.
|
|
200
|
+
|
|
201
|
+
**Incorrect (base):**
|
|
202
|
+
|
|
203
|
+
```tsx
|
|
204
|
+
<ToggleGroup type="single" defaultValue="daily">
|
|
205
|
+
<ToggleGroupItem value="daily">Daily</ToggleGroupItem>
|
|
206
|
+
</ToggleGroup>
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
**Correct (base):**
|
|
210
|
+
|
|
211
|
+
```tsx
|
|
212
|
+
// Single (no prop needed), defaultValue is always an array.
|
|
213
|
+
<ToggleGroup defaultValue={["daily"]} spacing={2}>
|
|
214
|
+
<ToggleGroupItem value="daily">Daily</ToggleGroupItem>
|
|
215
|
+
<ToggleGroupItem value="weekly">Weekly</ToggleGroupItem>
|
|
216
|
+
</ToggleGroup>
|
|
217
|
+
|
|
218
|
+
// Multi-selection.
|
|
219
|
+
<ToggleGroup multiple>
|
|
220
|
+
<ToggleGroupItem value="bold">Bold</ToggleGroupItem>
|
|
221
|
+
<ToggleGroupItem value="italic">Italic</ToggleGroupItem>
|
|
222
|
+
</ToggleGroup>
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
**Correct (radix):**
|
|
226
|
+
|
|
227
|
+
```tsx
|
|
228
|
+
// Single, defaultValue is a string.
|
|
229
|
+
<ToggleGroup type="single" defaultValue="daily" spacing={2}>
|
|
230
|
+
<ToggleGroupItem value="daily">Daily</ToggleGroupItem>
|
|
231
|
+
<ToggleGroupItem value="weekly">Weekly</ToggleGroupItem>
|
|
232
|
+
</ToggleGroup>
|
|
233
|
+
|
|
234
|
+
// Multi-selection.
|
|
235
|
+
<ToggleGroup type="multiple">
|
|
236
|
+
<ToggleGroupItem value="bold">Bold</ToggleGroupItem>
|
|
237
|
+
<ToggleGroupItem value="italic">Italic</ToggleGroupItem>
|
|
238
|
+
</ToggleGroup>
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
**Controlled single value:**
|
|
242
|
+
|
|
243
|
+
```tsx
|
|
244
|
+
// base — wrap/unwrap arrays.
|
|
245
|
+
const [value, setValue] = React.useState("normal")
|
|
246
|
+
<ToggleGroup value={[value]} onValueChange={(v) => setValue(v[0])}>
|
|
247
|
+
|
|
248
|
+
// radix — plain string.
|
|
249
|
+
const [value, setValue] = React.useState("normal")
|
|
250
|
+
<ToggleGroup type="single" value={value} onValueChange={setValue}>
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
## Slider
|
|
256
|
+
|
|
257
|
+
Base accepts a plain number for a single thumb. Radix always requires an array.
|
|
258
|
+
|
|
259
|
+
**Incorrect (base):**
|
|
260
|
+
|
|
261
|
+
```tsx
|
|
262
|
+
<Slider defaultValue={[50]} max={100} step={1} />
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
**Correct (base):**
|
|
266
|
+
|
|
267
|
+
```tsx
|
|
268
|
+
<Slider defaultValue={50} max={100} step={1} />
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
**Correct (radix):**
|
|
272
|
+
|
|
273
|
+
```tsx
|
|
274
|
+
<Slider defaultValue={[50]} max={100} step={1} />
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
Both use arrays for range sliders. Controlled `onValueChange` in base may need a cast:
|
|
278
|
+
|
|
279
|
+
```tsx
|
|
280
|
+
// base.
|
|
281
|
+
const [value, setValue] = React.useState([0.3, 0.7])
|
|
282
|
+
<Slider value={value} onValueChange={(v) => setValue(v as number[])} />
|
|
283
|
+
|
|
284
|
+
// radix.
|
|
285
|
+
const [value, setValue] = React.useState([0.3, 0.7])
|
|
286
|
+
<Slider value={value} onValueChange={setValue} />
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## Accordion
|
|
292
|
+
|
|
293
|
+
Radix requires `type="single"` or `type="multiple"` and supports `collapsible`. `defaultValue` is a string. Base uses no `type` prop, uses `multiple` boolean, and `defaultValue` is always an array.
|
|
294
|
+
|
|
295
|
+
**Incorrect (base):**
|
|
296
|
+
|
|
297
|
+
```tsx
|
|
298
|
+
<Accordion type="single" collapsible defaultValue="item-1">
|
|
299
|
+
<AccordionItem value="item-1">...</AccordionItem>
|
|
300
|
+
</Accordion>
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
**Correct (base):**
|
|
304
|
+
|
|
305
|
+
```tsx
|
|
306
|
+
<Accordion defaultValue={["item-1"]}>
|
|
307
|
+
<AccordionItem value="item-1">...</AccordionItem>
|
|
308
|
+
</Accordion>
|
|
309
|
+
|
|
310
|
+
// Multi-select.
|
|
311
|
+
<Accordion multiple defaultValue={["item-1", "item-2"]}>
|
|
312
|
+
<AccordionItem value="item-1">...</AccordionItem>
|
|
313
|
+
<AccordionItem value="item-2">...</AccordionItem>
|
|
314
|
+
</Accordion>
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
**Correct (radix):**
|
|
318
|
+
|
|
319
|
+
```tsx
|
|
320
|
+
<Accordion type="single" collapsible defaultValue="item-1">
|
|
321
|
+
<AccordionItem value="item-1">...</AccordionItem>
|
|
322
|
+
</Accordion>
|
|
323
|
+
```
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Component Selection
|
|
2
|
+
|
|
3
|
+
Reach for an existing component before writing markup. Almost every "just a styled `div`" in a shadcn codebase is a component someone didn't know existed — and the hand-rolled version misses the states (focus, disabled, invalid, dark mode) that the real one already handles.
|
|
4
|
+
|
|
5
|
+
| Need | Use |
|
|
6
|
+
| --- | --- |
|
|
7
|
+
| Button/action | `Button` — variants: `default`, `outline`, `secondary`, `ghost`, `destructive`, `link` |
|
|
8
|
+
| Related buttons in a row | `ButtonGroup` (+ `ButtonGroupSeparator`, `ButtonGroupText`) |
|
|
9
|
+
| Form layout | `Field` family — see [forms.md](./forms.md) for the full export list |
|
|
10
|
+
| Form inputs | `Input`, `Select`, `Combobox`, `Switch`, `Checkbox`, `RadioGroup`, `Textarea`, `InputOTP`, `Slider` |
|
|
11
|
+
| Input with affix/button | `InputGroup` + `InputGroupInput` + `InputGroupAddon` / `InputGroupButton` / `InputGroupText` |
|
|
12
|
+
| Toggle between 2–5 options | `ToggleGroup` + `ToggleGroupItem` |
|
|
13
|
+
| List rows (not a table) | `Item` family — `ItemGroup`, `Item`, `ItemMedia`, `ItemContent`, `ItemTitle`, `ItemActions` |
|
|
14
|
+
| Data display | `Table`, `Card`, `Badge`, `Avatar` — static/read-only only |
|
|
15
|
+
| Portal list/index page | **DiceUI DataTable** — the default there, not a bare `Table`. See [data-table.md](./data-table.md) |
|
|
16
|
+
| Navigation | `Sidebar`, `NavigationMenu`, `Breadcrumb`, `Tabs`, `Pagination` |
|
|
17
|
+
| Overlays | `Dialog` (modal), `Sheet` (side panel), `Drawer` (bottom sheet), `AlertDialog` (confirmation) |
|
|
18
|
+
| Feedback | `sonner` (toast), `Alert`, `Progress`, `Skeleton`, `Spinner` |
|
|
19
|
+
| Command palette | `Command` inside `Dialog` |
|
|
20
|
+
| Charts | `Chart` (wraps Recharts) |
|
|
21
|
+
| Layout | `Card`, `Separator`, `Resizable`, `ScrollArea`, `Accordion`, `Collapsible` |
|
|
22
|
+
| Empty states | `Empty` (+ `EmptyHeader`, `EmptyMedia`, `EmptyTitle`, `EmptyDescription`, `EmptyContent`) |
|
|
23
|
+
| Menus | `DropdownMenu`, `ContextMenu`, `Menubar` |
|
|
24
|
+
| Tooltips/info | `Tooltip`, `HoverCard`, `Popover` |
|
|
25
|
+
|
|
26
|
+
Not sure whether something exists? `npx shadcn@latest search @shadcn -q "<thing>"` answers it in one call — cheaper than building the wrong thing and cheaper than guessing.
|
|
27
|
+
|
|
28
|
+
## Key patterns
|
|
29
|
+
|
|
30
|
+
The handful of shapes that most often separate correct shadcn code from plausible-looking code. Edge cases live in the rule files linked from [SKILL.md](../SKILL.md#critical-rules).
|
|
31
|
+
|
|
32
|
+
```tsx
|
|
33
|
+
// Form layout: FieldGroup + Field, not div + Label.
|
|
34
|
+
<FieldGroup>
|
|
35
|
+
<Field>
|
|
36
|
+
<FieldLabel htmlFor="email">Email</FieldLabel>
|
|
37
|
+
<Input id="email" />
|
|
38
|
+
</Field>
|
|
39
|
+
</FieldGroup>
|
|
40
|
+
|
|
41
|
+
// Validation: data-invalid on Field, aria-invalid on the control, error in FieldError.
|
|
42
|
+
// FieldError carries role="alert"; FieldDescription is muted helper text and announces nothing.
|
|
43
|
+
<Field data-invalid={!!error}>
|
|
44
|
+
<FieldLabel htmlFor="email">Email</FieldLabel>
|
|
45
|
+
<Input id="email" aria-invalid={!!error} />
|
|
46
|
+
<FieldError>Enter a valid email address.</FieldError>
|
|
47
|
+
</Field>
|
|
48
|
+
|
|
49
|
+
// Icons in buttons: data-icon, no sizing classes — the component sizes its own icons.
|
|
50
|
+
<Button>
|
|
51
|
+
<SearchIcon data-icon="inline-start" />
|
|
52
|
+
Search
|
|
53
|
+
</Button>
|
|
54
|
+
|
|
55
|
+
// Spacing: gap-*, not space-y-*.
|
|
56
|
+
<div className="flex flex-col gap-4"> // correct
|
|
57
|
+
<div className="space-y-4"> // wrong
|
|
58
|
+
|
|
59
|
+
// Equal dimensions: size-*, not w-* h-*.
|
|
60
|
+
<Avatar className="size-10"> // correct
|
|
61
|
+
<Avatar className="w-10 h-10"> // wrong
|
|
62
|
+
|
|
63
|
+
// Status colors: Badge variants or semantic tokens, not raw colors.
|
|
64
|
+
// Badge has no `success` variant — an invalid one falls back silently.
|
|
65
|
+
<Badge variant="secondary">+20.1%</Badge> // correct
|
|
66
|
+
<span className="text-emerald-600">+20.1%</span> // wrong
|
|
67
|
+
```
|