@thedecipherist/claude-packs 0.0.0-stage → 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/CHANGELOG.md +680 -0
- package/LICENSE +21 -0
- package/README.md +316 -2
- package/bin/claude-packs.mjs +204 -0
- package/configurations/base/config.json +85 -0
- package/configurations/cpp/config.json +92 -0
- package/configurations/full-stack/config.json +152 -0
- package/configurations/go/config.json +96 -0
- package/configurations/node/config.json +100 -0
- package/configurations/python/config.json +97 -0
- package/configurations/synth-creator/config.json +148 -0
- package/global/hooks/gnu-shell.mjs +131 -0
- package/global/hooks/lib/program-read.mjs +196 -0
- package/global/hooks/lib/program-writes.mjs +177 -0
- package/global/hooks/lib/shell-writes.mjs +293 -0
- package/global/hooks/shell-traps.mjs +79 -0
- package/global/hooks/version-pin-guard.mjs +280 -0
- package/global/skills/latest-versions/SKILL.md +49 -0
- package/lib/backup.mjs +34 -0
- package/lib/claude-md.mjs +58 -0
- package/lib/config-cli.mjs +36 -0
- package/lib/configs.mjs +145 -0
- package/lib/coverage.mjs +86 -0
- package/lib/custom-packs.mjs +93 -0
- package/lib/doctor.mjs +115 -0
- package/lib/fix-plan.mjs +71 -0
- package/lib/git-tokens.mjs +64 -0
- package/lib/global.mjs +125 -0
- package/lib/hook-proof.mjs +28 -0
- package/lib/hook-timing.mjs +42 -0
- package/lib/hover-gate.mjs +29 -0
- package/lib/kit-lock.mjs +149 -0
- package/lib/layout.mjs +75 -0
- package/lib/logs.mjs +69 -0
- package/lib/manifest.mjs +24 -0
- package/lib/new.mjs +49 -0
- package/lib/once-only-report.mjs +54 -0
- package/lib/pack-manifest.mjs +20 -0
- package/lib/packs.mjs +107 -0
- package/lib/planner.mjs +59 -0
- package/lib/repeats.mjs +65 -0
- package/lib/repo-weight.mjs +28 -0
- package/lib/rules.mjs +40 -0
- package/lib/scan-detect.mjs +94 -0
- package/lib/scan.mjs +168 -0
- package/lib/selftest-cache.mjs +39 -0
- package/lib/settings.mjs +138 -0
- package/lib/shape-cli.mjs +76 -0
- package/lib/shape.mjs +4 -0
- package/lib/suggest.mjs +18 -0
- package/lib/switches.mjs +44 -0
- package/lib/symmetry-doctor.mjs +26 -0
- package/lib/sync.mjs +130 -0
- package/package.json +34 -4
- package/packs/ai/checks/boundary-computes-its-own-hash.json +30 -0
- package/packs/ai/checks/model-call-needs-boundary.json +29 -0
- package/packs/ai/checks/model-id-from-config.json +28 -0
- package/packs/ai/checks/model-output-validated.json +26 -0
- package/packs/ai/pack.json +38 -0
- package/packs/ai/rules/ai-input-sha-boundary.md +31 -0
- package/packs/ai/rules/llm-pipeline-security.md +26 -0
- package/packs/audio-core/checks/denormals-not-in-prepare.json +12 -0
- package/packs/audio-core/checks/dsp-without-apvts.json +12 -0
- package/packs/audio-core/checks/float-phase-or-rate.json +12 -0
- package/packs/audio-core/checks/juce-snap-to-zero-off.json +12 -0
- package/packs/audio-core/checks/keep-werror.json +12 -0
- package/packs/audio-core/checks/no-fast-math.json +14 -0
- package/packs/audio-core/checks/no-locale-change.json +12 -0
- package/packs/audio-core/checks/no-march-native.json +14 -0
- package/packs/audio-core/clang-tidy +28 -0
- package/packs/audio-core/hooks/lib/realtime-checks.mjs +56 -0
- package/packs/audio-core/hooks/param-id-lock.mjs +129 -0
- package/packs/audio-core/hooks/realtime-guard.mjs +67 -0
- package/packs/audio-core/pack.json +187 -0
- package/packs/audio-core/rules/audio-thread-realtime-safe.md +27 -0
- package/packs/audio-core/rules/audio-ui-thread-handoff.md +21 -0
- package/packs/audio-core/rules/boundary-tests-cross-the-boundary.md +16 -0
- package/packs/audio-core/rules/build-flags-safe.md +20 -0
- package/packs/audio-core/rules/cached-parameter-pointers.md +28 -0
- package/packs/audio-core/rules/clang-tidy-core-guidelines.md +21 -0
- package/packs/audio-core/rules/control-reaches-every-surface.md +23 -0
- package/packs/audio-core/rules/cpu-worst-case-per-block.md +26 -0
- package/packs/audio-core/rules/dc-block-after-asymmetry.md +22 -0
- package/packs/audio-core/rules/discrete-params-snap.md +19 -0
- package/packs/audio-core/rules/double-where-precision-matters.md +20 -0
- package/packs/audio-core/rules/filters-stable-under-modulation.md +29 -0
- package/packs/audio-core/rules/host-parameters-at-scale.md +24 -0
- package/packs/audio-core/rules/house-control-behaviours.md +34 -0
- package/packs/audio-core/rules/math-domain-guards.md +19 -0
- package/packs/audio-core/rules/modulated-delay-interpolation.md +22 -0
- package/packs/audio-core/rules/multiband-phase-coherent.md +22 -0
- package/packs/audio-core/rules/nonlinear-stages-antialiased.md +28 -0
- package/packs/audio-core/rules/note-ledger-and-pedals.md +22 -0
- package/packs/audio-core/rules/one-formula-per-value.md +20 -0
- package/packs/audio-core/rules/optimisations-are-null-tested.md +23 -0
- package/packs/audio-core/rules/oscillators-bandlimited.md +23 -0
- package/packs/audio-core/rules/output-limiter.md +23 -0
- package/packs/audio-core/rules/parameter-ids-never-change.md +20 -0
- package/packs/audio-core/rules/params-and-state-thread-safe.md +19 -0
- package/packs/audio-core/rules/params-snapshot-per-block.md +21 -0
- package/packs/audio-core/rules/patch-excludes-performance-controls.md +18 -0
- package/packs/audio-core/rules/per-sample-code-inlinable.md +22 -0
- package/packs/audio-core/rules/prepare-is-repeatable.md +23 -0
- package/packs/audio-core/rules/recursive-state-nan-guard.md +20 -0
- package/packs/audio-core/rules/reverb-loop-gain-bounded.md +24 -0
- package/packs/audio-core/rules/sample-accurate-midi.md +22 -0
- package/packs/audio-core/rules/sample-rate-and-block-size-from-host.md +23 -0
- package/packs/audio-core/rules/scoped-no-denormals.md +26 -0
- package/packs/audio-core/rules/smooth-continuous-parameters.md +22 -0
- package/packs/audio-core/rules/state-load-versioned-and-safe.md +22 -0
- package/packs/audio-core/rules/straight-on-and-aligned.md +21 -0
- package/packs/audio-core/rules/ui-matches-reference-look.md +21 -0
- package/packs/audio-core/rules/undo-one-gesture-one-step.md +21 -0
- package/packs/audio-core/rules/voice-steal-fades.md +21 -0
- package/packs/audio-core/rules/voice-sum-headroom.md +20 -0
- package/packs/audio-core/skills/analyse-reference-look/SKILL.md +21 -0
- package/packs/audio-core/skills/copy-and-prove/SKILL.md +98 -0
- package/packs/audio-core/skills/juce-realtime-audit/SKILL.md +22 -0
- package/packs/audio-core/skills/measure-tone/SKILL.md +20 -0
- package/packs/audio-core/skills/new-panel-control/SKILL.md +15 -0
- package/packs/audio-core/skills/prove-control/SKILL.md +23 -0
- package/packs/audio-core/skills/trace-parameter/SKILL.md +29 -0
- package/packs/audio-core/tools/lib/spectrum.mjs +112 -0
- package/packs/audio-core/tools/lib/wav.mjs +41 -0
- package/packs/audio-core/tools/tone-report.mjs +47 -0
- package/packs/base/checks/field-map-over-if-runs.json +25 -0
- package/packs/base/checks/lookup-over-if-chains.json +25 -0
- package/packs/base/checks/lookup-over-ternary-chains.json +20 -0
- package/packs/base/checks/no-code-after-midline-comment.json +12 -0
- package/packs/base/checks/one-walk-per-template.json +23 -0
- package/packs/base/checks/stub-reports-success.json +31 -0
- package/packs/base/checks/test-skip-on-failed-setup.json +17 -0
- package/packs/base/hooks/brief-guard.mjs +96 -0
- package/packs/base/hooks/code-shape.mjs +95 -0
- package/packs/base/hooks/dispatch-once.mjs +87 -0
- package/packs/base/hooks/file-size-guard.mjs +61 -0
- package/packs/base/hooks/folder-law.mjs +74 -0
- package/packs/base/hooks/git-guard.mjs +289 -0
- package/packs/base/hooks/lesson-checks.mjs +174 -0
- package/packs/base/hooks/lib/apply-edit.mjs +20 -0
- package/packs/base/hooks/lib/code-shapes.mjs +137 -0
- package/packs/base/hooks/lib/content.mjs +14 -0
- package/packs/base/hooks/lib/cpp-scan.mjs +94 -0
- package/packs/base/hooks/lib/dup-index.mjs +199 -0
- package/packs/base/hooks/lib/dup.mjs +127 -0
- package/packs/base/hooks/lib/elements.mjs +87 -0
- package/packs/base/hooks/lib/event-log.mjs +67 -0
- package/packs/base/hooks/lib/function-shapes.mjs +90 -0
- package/packs/base/hooks/lib/git-adds.mjs +20 -0
- package/packs/base/hooks/lib/git-guard-selftest.mjs +99 -0
- package/packs/base/hooks/lib/glob.mjs +33 -0
- package/packs/base/hooks/lib/hook-log.mjs +100 -0
- package/packs/base/hooks/lib/house.py +77 -0
- package/packs/base/hooks/lib/languages.mjs +66 -0
- package/packs/base/hooks/lib/layout.mjs +54 -0
- package/packs/base/hooks/lib/making-check-selftest.mjs +109 -0
- package/packs/base/hooks/lib/near-copies.mjs +76 -0
- package/packs/base/hooks/lib/program-read.mjs +196 -0
- package/packs/base/hooks/lib/program-writes.mjs +177 -0
- package/packs/base/hooks/lib/project.mjs +81 -0
- package/packs/base/hooks/lib/prose.mjs +11 -0
- package/packs/base/hooks/lib/pushed.mjs +201 -0
- package/packs/base/hooks/lib/repo-index.mjs +52 -0
- package/packs/base/hooks/lib/secret-patterns.mjs +18 -0
- package/packs/base/hooks/lib/selftest.mjs +45 -0
- package/packs/base/hooks/lib/shape-code.mjs +126 -0
- package/packs/base/hooks/lib/shape.mjs +294 -0
- package/packs/base/hooks/lib/shell-writes-selftest.mjs +65 -0
- package/packs/base/hooks/lib/shell-writes.mjs +293 -0
- package/packs/base/hooks/lib/turn.mjs +81 -0
- package/packs/base/hooks/lib/writes.mjs +71 -0
- package/packs/base/hooks/making-check.mjs +243 -0
- package/packs/base/hooks/making.mjs +106 -0
- package/packs/base/hooks/once-only.mjs +150 -0
- package/packs/base/hooks/placement-law.mjs +84 -0
- package/packs/base/hooks/repo-litter.mjs +75 -0
- package/packs/base/hooks/reuse-hint.mjs +75 -0
- package/packs/base/hooks/run-hooks.mjs +132 -0
- package/packs/base/hooks/secrets-guard.mjs +99 -0
- package/packs/base/hooks/shape-law.mjs +133 -0
- package/packs/base/hooks/suite-once.mjs +80 -0
- package/packs/base/hooks/template-law.mjs +148 -0
- package/packs/base/hooks/untrusted-boundary.mjs +53 -0
- package/packs/base/pack.json +214 -0
- package/packs/base/rules/a-control-is-seen-to-fire.md +27 -0
- package/packs/base/rules/behaviour-lives-with-its-kind.md +51 -0
- package/packs/base/rules/bug-fix-starts-red.md +25 -0
- package/packs/base/rules/field-map-over-if-runs.md +47 -0
- package/packs/base/rules/finished-work-lands.md +17 -0
- package/packs/base/rules/git-right-first-time.md +19 -0
- package/packs/base/rules/instances-by-index-identities-by-id.md +54 -0
- package/packs/base/rules/lookup-over-if-chains.md +49 -0
- package/packs/base/rules/making-line-first.md +14 -0
- package/packs/base/rules/open-items-tagged.md +17 -0
- package/packs/base/rules/plan-and-logs.md +22 -0
- package/packs/base/rules/references-use-anchors.md +19 -0
- package/packs/base/rules/refusals-are-judged.md +18 -0
- package/packs/base/rules/reuse-before-writing.md +15 -0
- package/packs/base/rules/secrets-never-committed.md +16 -0
- package/packs/base/rules/skill-writing.md +23 -0
- package/packs/base/rules/split-before-the-limit.md +14 -0
- package/packs/base/rules/subagent-dispatch.md +26 -0
- package/packs/base/rules/test-only-what-changed.md +17 -0
- package/packs/base/rules/test-the-template-once.md +22 -0
- package/packs/base/rules/untrusted-content-boundary.md +15 -0
- package/packs/base/skills/add-lesson-check/SKILL.md +26 -0
- package/packs/base/skills/fix-from-scan/SKILL.md +25 -0
- package/packs/base/skills/land-branch/SKILL.md +24 -0
- package/packs/base/skills/make-it-a-template/SKILL.md +23 -0
- package/packs/base/skills/pdf-to-md/SKILL.md +25 -0
- package/packs/base/skills/pick-tests/SKILL.md +20 -0
- package/packs/base/skills/pressure-test-skill/SKILL.md +23 -0
- package/packs/base/skills/prove-instances-identical/SKILL.md +37 -0
- package/packs/base/tools/shape-symmetry-selftest.mjs +66 -0
- package/packs/base/tools/shape-symmetry.mjs +178 -0
- package/packs/base/tools/test-verdict.mjs +75 -0
- package/packs/ci/checks/ci-permissions-stated.json +18 -0
- package/packs/ci/checks/ci-tools-pinned.json +14 -0
- package/packs/ci/pack.json +21 -0
- package/packs/ci/rules/ci-covers-what-ships.md +20 -0
- package/packs/ci/rules/generated-files-have-no-diff.md +15 -0
- package/packs/content-site/checks/captcha-is-not-constant.json +27 -0
- package/packs/content-site/checks/img-has-size.json +20 -0
- package/packs/content-site/checks/page-head-complete.json +26 -0
- package/packs/content-site/pack.json +22 -0
- package/packs/content-site/rules/content-has-one-source.md +23 -0
- package/packs/content-site/rules/media-is-sized.md +24 -0
- package/packs/content-site/rules/page-head-is-complete.md +26 -0
- package/packs/content-site/rules/public-forms-are-defended.md +27 -0
- package/packs/content-site/skills/publish-a-page/SKILL.md +21 -0
- package/packs/cpp/checks/cpp-clamp-before-cast.json +16 -0
- package/packs/cpp/checks/cpp-find-with-the-library.json +12 -0
- package/packs/cpp/checks/cpp-hardened-test-build.json +18 -0
- package/packs/cpp/checks/cpp-m-pi-not-standard.json +23 -0
- package/packs/cpp/checks/cpp-no-atoi.json +16 -0
- package/packs/cpp/checks/cpp-no-const-cast.json +16 -0
- package/packs/cpp/checks/cpp-no-float-loop-counter.json +16 -0
- package/packs/cpp/checks/cpp-no-getenv-in-product.json +22 -0
- package/packs/cpp/checks/cpp-no-mutable-global.json +20 -0
- package/packs/cpp/checks/cpp-no-mutable-local-static.json +23 -0
- package/packs/cpp/checks/cpp-no-unchecked-fwrite.json +17 -0
- package/packs/cpp/checks/cpp-no-using-namespace-in-header.json +19 -0
- package/packs/cpp/checks/cpp-no-zero-size-array.json +23 -0
- package/packs/cpp/checks/cpp-numbers-pi.json +16 -0
- package/packs/cpp/pack.json +22 -0
- package/packs/cpp/rules/cpp-absent-and-failed-are-types.md +24 -0
- package/packs/cpp/rules/cpp-builds-everywhere.md +26 -0
- package/packs/cpp/rules/cpp-faults-only-in-the-test-build.md +21 -0
- package/packs/cpp/rules/cpp-find-with-the-library.md +19 -0
- package/packs/cpp/rules/cpp-gates-share-one-reader.md +22 -0
- package/packs/cpp/rules/cpp-headers-declare.md +22 -0
- package/packs/cpp/rules/cpp-numbers-and-casts.md +22 -0
- package/packs/cpp/rules/cpp-repeats-become-templates.md +33 -0
- package/packs/cpp/rules/cpp-static-analysis-runs.md +22 -0
- package/packs/cpp/rules/cpp-thread-contracts-are-code.md +23 -0
- package/packs/cpp/skills/cpp-extract-template/SKILL.md +38 -0
- package/packs/docker/checks/alpine-with-native-build.json +13 -0
- package/packs/docker/checks/compose-db-needs-auth.json +14 -0
- package/packs/docker/checks/compose-image-pinned.json +14 -0
- package/packs/docker/checks/compose-no-hardcoded-ip.json +12 -0
- package/packs/docker/checks/compose-no-host-bind-for-data.json +18 -0
- package/packs/docker/checks/compose-no-plaintext-secret.json +13 -0
- package/packs/docker/checks/compose-no-swarm-ignored-keys.json +13 -0
- package/packs/docker/checks/compose-overlay-not-bridge.json +13 -0
- package/packs/docker/checks/compose-service-needs-healthcheck.json +11 -0
- package/packs/docker/checks/compose-service-needs-init.json +11 -0
- package/packs/docker/checks/copy-needs-chown-with-user.json +17 -0
- package/packs/docker/checks/copy-source-before-deps.json +13 -0
- package/packs/docker/checks/docker-exec-form.json +16 -0
- package/packs/docker/checks/dockerfile-needs-healthcheck.json +17 -0
- package/packs/docker/checks/dockerfile-needs-user.json +21 -0
- package/packs/docker/checks/dockerignore-has-the-basics.json +21 -0
- package/packs/docker/checks/gitattributes-forces-lf.json +17 -0
- package/packs/docker/checks/health-checks-nothing.json +25 -0
- package/packs/docker/checks/no-crlf-in-scripts.json +15 -0
- package/packs/docker/checks/no-latest-base.json +13 -0
- package/packs/docker/checks/no-secret-in-image.json +13 -0
- package/packs/docker/checks/no-sensitive-file-copy.json +13 -0
- package/packs/docker/checks/node-env-before-install.json +13 -0
- package/packs/docker/checks/npm-ci-not-install.json +13 -0
- package/packs/docker/pack.json +46 -0
- package/packs/docker/rules/compose-pinned-and-closed.md +21 -0
- package/packs/docker/rules/compose-swarm-safe.md +26 -0
- package/packs/docker/rules/docker-exec-form.md +19 -0
- package/packs/docker/rules/dockerfile-multistage.md +13 -0
- package/packs/docker/rules/dockerfile-production.md +25 -0
- package/packs/docker/skills/docker-diagnose/SKILL.md +23 -0
- package/packs/dynamic-data/checks/draft-on-the-server.json +27 -0
- package/packs/dynamic-data/checks/guard-does-its-job.json +28 -0
- package/packs/dynamic-data/checks/key-is-not-a-display-name.json +28 -0
- package/packs/dynamic-data/checks/no-code-from-data.json +29 -0
- package/packs/dynamic-data/checks/no-collection-from-request.json +27 -0
- package/packs/dynamic-data/checks/no-pipeline-from-stored-text.json +27 -0
- package/packs/dynamic-data/checks/no-regexp-from-stored-config.json +27 -0
- package/packs/dynamic-data/checks/no-template-from-stored-text.json +27 -0
- package/packs/dynamic-data/checks/save-takes-named-paths.json +27 -0
- package/packs/dynamic-data/pack.json +23 -0
- package/packs/dynamic-data/rules/a-list-is-a-saved-query.md +23 -0
- package/packs/dynamic-data/rules/definitions-are-validated-data.md +24 -0
- package/packs/dynamic-data/rules/every-dynamic-surface-has-a-boundary.md +29 -0
- package/packs/dynamic-data/rules/fields-have-owners.md +22 -0
- package/packs/dynamic-data/rules/imports-drop-nothing.md +26 -0
- package/packs/dynamic-data/rules/one-definition-many-surfaces.md +24 -0
- package/packs/dynamic-data/rules/one-fact-one-place.md +28 -0
- package/packs/dynamic-data/rules/rules-live-in-the-engine.md +29 -0
- package/packs/dynamic-data/rules/saves-are-patches.md +28 -0
- package/packs/dynamic-data/rules/tenant-costs-one-document.md +22 -0
- package/packs/dynamic-data/skills/design-a-definition/SKILL.md +24 -0
- package/packs/fastify/checks/api-routes-versioned.json +28 -0
- package/packs/fastify/checks/cookie-host-prefix.json +24 -0
- package/packs/fastify/checks/hijack-needs-try.json +28 -0
- package/packs/fastify/checks/no-cast-at-route-boundary.json +24 -0
- package/packs/fastify/checks/no-db-in-route-file.json +28 -0
- package/packs/fastify/checks/no-err-message-to-client.json +24 -0
- package/packs/fastify/checks/no-regexp-from-input.json +24 -0
- package/packs/fastify/checks/no-trust-proxy-true.json +25 -0
- package/packs/fastify/checks/one-error-body.json +26 -0
- package/packs/fastify/checks/origin-from-config-not-host.json +31 -0
- package/packs/fastify/checks/password-needs-slow-hash.json +30 -0
- package/packs/fastify/checks/sec-headers-present.json +28 -0
- package/packs/fastify/checks/secrets-compared-constant-time.json +24 -0
- package/packs/fastify/checks/sse-needs-error-listener.json +28 -0
- package/packs/fastify/checks/user-bytes-need-disposition.json +29 -0
- package/packs/fastify/pack.json +41 -0
- package/packs/fastify/rules/credentials-and-input.md +23 -0
- package/packs/fastify/rules/security-one-switch.md +28 -0
- package/packs/fastify/rules/streams-and-hijacks.md +22 -0
- package/packs/fastify/rules/tests-use-inject.md +13 -0
- package/packs/fastify/rules/three-layers.md +20 -0
- package/packs/fastify/rules/trust-config-not-headers.md +24 -0
- package/packs/full-stack/checks/no-express-no-vite.json +23 -0
- package/packs/full-stack/hooks/stack-guard.mjs +90 -0
- package/packs/full-stack/pack.json +76 -0
- package/packs/full-stack/rules/stack-is-fastify-and-nextjs.md +20 -0
- package/packs/go/checks/go-exec-result-ignored.json +15 -0
- package/packs/go/checks/go-unmarshal-error-ignored.json +15 -0
- package/packs/go/pack.json +21 -0
- package/packs/go/rules/go-errors-are-handled.md +22 -0
- package/packs/gpu-painter/checks/dawn-backends-and-validation.json +9 -0
- package/packs/gpu-painter/checks/dawn-no-spontaneous.json +10 -0
- package/packs/gpu-painter/checks/dawn-present-on-render-thread.json +17 -0
- package/packs/gpu-painter/checks/gpu-no-frame-stalls.json +12 -0
- package/packs/gpu-painter/checks/no-opengl-link.json +11 -0
- package/packs/gpu-painter/checks/no-opengl.json +13 -0
- package/packs/gpu-painter/hooks/browser-guard.py +196 -0
- package/packs/gpu-painter/pack.json +91 -0
- package/packs/gpu-painter/rules/dawn-build-and-shaders.md +27 -0
- package/packs/gpu-painter/rules/dawn-device-and-render-thread.md +26 -0
- package/packs/gpu-painter/rules/gpu-antialiasing.md +20 -0
- package/packs/gpu-painter/rules/gpu-blend-order.md +22 -0
- package/packs/gpu-painter/rules/gpu-bloom.md +20 -0
- package/packs/gpu-painter/rules/gpu-frame-budget.md +25 -0
- package/packs/gpu-painter/rules/gpu-frame-pacing-and-power.md +27 -0
- package/packs/gpu-painter/rules/gpu-frame-work.md +30 -0
- package/packs/gpu-painter/rules/gpu-golden-images.md +21 -0
- package/packs/gpu-painter/rules/gpu-hdr-and-tonemap.md +23 -0
- package/packs/gpu-painter/rules/gpu-picking-on-cpu.md +19 -0
- package/packs/gpu-painter/rules/gpu-render-lifecycle.md +25 -0
- package/packs/gpu-painter/rules/gpu-text-atlas.md +24 -0
- package/packs/gpu-painter/rules/gpu-travellers-from-snapshot.md +24 -0
- package/packs/gpu-painter/rules/hover-every-pressable.md +25 -0
- package/packs/gpu-painter/skills/gpu-capture/SKILL.md +15 -0
- package/packs/gpu-painter/skills/gpu-frame-bench/SKILL.md +14 -0
- package/packs/gpu-painter/skills/gpu-golden-check/SKILL.md +13 -0
- package/packs/gpu-painter/skills/gpu-golden-update/SKILL.md +16 -0
- package/packs/gpu-painter/skills/gpu-lifecycle-stress/SKILL.md +15 -0
- package/packs/gpu-painter/skills/hover-state/SKILL.md +33 -0
- package/packs/hook-proof/checks/hook-catch-must-not-allow.json +16 -0
- package/packs/hook-proof/checks/hook-command-no-pipe.json +16 -0
- package/packs/hook-proof/checks/hook-exit-1-does-not-block.json +17 -0
- package/packs/hook-proof/checks/hook-no-or-true.json +18 -0
- package/packs/hook-proof/checks/hook-refusal-on-stderr.json +17 -0
- package/packs/hook-proof/pack.json +38 -0
- package/packs/hook-proof/rules/a-refusal-is-exit-2.md +28 -0
- package/packs/hook-proof/skills/prove-a-hook/SKILL.md +21 -0
- package/packs/host-agent/checks/file-path-from-param.json +27 -0
- package/packs/host-agent/checks/integrity-check-optional.json +27 -0
- package/packs/host-agent/checks/quoted-value-into-config.json +24 -0
- package/packs/host-agent/checks/secret-on-argv.json +28 -0
- package/packs/host-agent/checks/ssh-verifies-host-key.json +27 -0
- package/packs/host-agent/checks/system-file-written-in-place.json +26 -0
- package/packs/host-agent/checks/tmp-path-predictable.json +27 -0
- package/packs/host-agent/pack.json +22 -0
- package/packs/host-agent/rules/root-on-other-machines.md +27 -0
- package/packs/html-ui/checks/email-html-escapes.json +25 -0
- package/packs/html-ui/checks/external-link-rel.json +21 -0
- package/packs/html-ui/checks/no-duplicate-escape.json +26 -0
- package/packs/html-ui/checks/no-inline-client-script.json +21 -0
- package/packs/html-ui/checks/no-inline-style.json +23 -0
- package/packs/html-ui/pack.json +33 -0
- package/packs/html-ui/rules/email-html-escapes.md +19 -0
- package/packs/html-ui/rules/server-html-escapes-everything.md +22 -0
- package/packs/http-api/checks/api-path-versioned.json +31 -0
- package/packs/http-api/checks/authz-from-request-body.json +26 -0
- package/packs/http-api/checks/client-calls-a-version.json +28 -0
- package/packs/http-api/checks/client-ip-not-leftmost-xff.json +28 -0
- package/packs/http-api/checks/cors-needs-origin.json +26 -0
- package/packs/http-api/checks/csp-not-switched-off.json +28 -0
- package/packs/http-api/checks/debug-route-not-shipped.json +26 -0
- package/packs/http-api/checks/encrypted-name-plaintext-value.json +26 -0
- package/packs/http-api/checks/err-text-stays-server-side.json +27 -0
- package/packs/http-api/checks/failure-is-not-empty.json +28 -0
- package/packs/http-api/checks/gate-is-not-a-todo.json +27 -0
- package/packs/http-api/checks/guard-fails-open.json +28 -0
- package/packs/http-api/checks/hmac-over-reserialised-body.json +26 -0
- package/packs/http-api/checks/jwt-verify-pins-algorithm.json +26 -0
- package/packs/http-api/checks/middleware-skips-without-user.json +26 -0
- package/packs/http-api/checks/next-api-route-versioned.json +47 -0
- package/packs/http-api/checks/no-security-off-switch.json +28 -0
- package/packs/http-api/checks/oauth-state-signed.json +26 -0
- package/packs/http-api/checks/one-time-code-compared-raw.json +26 -0
- package/packs/http-api/checks/query-cast-is-not-validation.json +28 -0
- package/packs/http-api/checks/queue-action-from-client.json +26 -0
- package/packs/http-api/checks/rate-limit-one-module.json +28 -0
- package/packs/http-api/checks/role-checked-in-one-guard.json +27 -0
- package/packs/http-api/checks/route-body-needs-schema.json +31 -0
- package/packs/http-api/checks/route-scopes-to-the-caller.json +31 -0
- package/packs/http-api/checks/secret-compared-constant-time-any.json +28 -0
- package/packs/http-api/checks/secret-in-job-record.json +27 -0
- package/packs/http-api/checks/server-fetches-tenant-url.json +30 -0
- package/packs/http-api/checks/short-code-needs-limit.json +26 -0
- package/packs/http-api/checks/user-url-through-safe-fetch.json +28 -0
- package/packs/http-api/checks/webhook-dedupes-event-id.json +30 -0
- package/packs/http-api/pack.json +45 -0
- package/packs/http-api/rules/adapters-one-db-gateway.md +18 -0
- package/packs/http-api/rules/apis-are-versioned.md +27 -0
- package/packs/http-api/rules/credentials-handled-safely.md +22 -0
- package/packs/http-api/rules/handlers-own-the-work.md +17 -0
- package/packs/http-api/rules/health-and-correlation.md +17 -0
- package/packs/http-api/rules/one-error-contract.md +17 -0
- package/packs/http-api/rules/routes-are-thin.md +17 -0
- package/packs/http-api/rules/routes-scope-to-the-caller.md +26 -0
- package/packs/http-api/rules/routes-validate-and-answer.md +25 -0
- package/packs/http-api/skills/change-an-api/SKILL.md +20 -0
- package/packs/http-api/skills/secure-a-route/SKILL.md +21 -0
- package/packs/instrument-shell/checks/no-raw-struct-blob.json +23 -0
- package/packs/instrument-shell/pack.json +22 -0
- package/packs/instrument-shell/rules/fold-keeps-every-route.md +24 -0
- package/packs/instrument-shell/rules/quiet-announces-itself.md +22 -0
- package/packs/instrument-shell/rules/render-the-extremes.md +25 -0
- package/packs/instrument-shell/rules/seams-are-declared.md +27 -0
- package/packs/instrument-shell/rules/session-blob-append-only.md +25 -0
- package/packs/instrument-shell/skills/gates-from-commit-one/SKILL.md +20 -0
- package/packs/instrument-shell/skills/hit-the-painted-control/SKILL.md +18 -0
- package/packs/js-ts/checks/async-callback-unguarded.json +26 -0
- package/packs/js-ts/checks/background-loop-needs-stop.json +28 -0
- package/packs/js-ts/checks/child-process-error-handler.json +28 -0
- package/packs/js-ts/checks/entry-registers-shutdown.json +31 -0
- package/packs/js-ts/checks/fetch-needs-timeout.json +30 -0
- package/packs/js-ts/checks/job-only-in-memory.json +28 -0
- package/packs/js-ts/checks/json-only-through-helper.json +29 -0
- package/packs/js-ts/checks/line-under-200-chars.json +34 -0
- package/packs/js-ts/checks/localhost-default-in-server.json +29 -0
- package/packs/js-ts/checks/no-any.json +27 -0
- package/packs/js-ts/checks/no-cast-escape-hatches.json +24 -0
- package/packs/js-ts/checks/no-console-in-app.json +31 -0
- package/packs/js-ts/checks/no-dynamic-import-node-builtin.json +25 -0
- package/packs/js-ts/checks/no-inline-binary.json +20 -0
- package/packs/js-ts/checks/no-inline-zod-outside-schemas.json +27 -0
- package/packs/js-ts/checks/no-local-sleep.json +25 -0
- package/packs/js-ts/checks/no-nested-ternary.json +20 -0
- package/packs/js-ts/checks/no-secret-in-log.json +24 -0
- package/packs/js-ts/checks/no-shell-string-interpolation.json +24 -0
- package/packs/js-ts/checks/no-swallowed-errors.json +25 -0
- package/packs/js-ts/checks/no-ts-enum.json +20 -0
- package/packs/js-ts/checks/process-env-only-in-config.json +31 -0
- package/packs/js-ts/checks/race-leaves-work-running.json +23 -0
- package/packs/js-ts/checks/reject-as-catch-all-exists.json +24 -0
- package/packs/js-ts/checks/secret-has-no-fallback.json +24 -0
- package/packs/js-ts/checks/secret-needs-crypto-random.json +24 -0
- package/packs/js-ts/checks/server-close-awaited.json +27 -0
- package/packs/js-ts/checks/session-user-typed-once.json +24 -0
- package/packs/js-ts/checks/switch-is-a-table.json +24 -0
- package/packs/js-ts/checks/test-imports-the-source.json +19 -0
- package/packs/js-ts/checks/test-name-says-behaviour.json +16 -0
- package/packs/js-ts/checks/tsconfig-flags.json +21 -0
- package/packs/js-ts/checks/void-needs-catch.json +24 -0
- package/packs/js-ts/checks/zod-string-needs-max.json +25 -0
- package/packs/js-ts/checks/zod-v4-formats.json +23 -0
- package/packs/js-ts/pack.json +84 -0
- package/packs/js-ts/rules/await-handled-at-a-boundary.md +66 -0
- package/packs/js-ts/rules/env-through-config.md +36 -0
- package/packs/js-ts/rules/errors-never-swallowed.md +33 -0
- package/packs/js-ts/rules/files-under-300-lines.md +18 -0
- package/packs/js-ts/rules/guard-clauses-over-nesting.md +34 -0
- package/packs/js-ts/rules/js-repeats-become-templates.md +26 -0
- package/packs/js-ts/rules/json-only-through-one-helper.md +62 -0
- package/packs/js-ts/rules/named-constants-not-magic-numbers.md +34 -0
- package/packs/js-ts/rules/no-any.md +34 -0
- package/packs/js-ts/rules/no-console.md +30 -0
- package/packs/js-ts/rules/no-floating-promises.md +31 -0
- package/packs/js-ts/rules/no-param-mutation.md +28 -0
- package/packs/js-ts/rules/no-unsafe-assertions.md +30 -0
- package/packs/js-ts/rules/one-logger.md +24 -0
- package/packs/js-ts/rules/outbound-calls-have-a-limit.md +20 -0
- package/packs/js-ts/rules/parallel-independent-awaits.md +29 -0
- package/packs/js-ts/rules/process-lifecycle.md +47 -0
- package/packs/js-ts/rules/schema-single-source-of-truth.md +36 -0
- package/packs/js-ts/rules/secrets-stay-secret.md +22 -0
- package/packs/js-ts/rules/small-functions.md +20 -0
- package/packs/js-ts/rules/test-names-describe-behavior.md +28 -0
- package/packs/js-ts/rules/tests-can-fail.md +19 -0
- package/packs/js-ts/rules/tsconfig-strict.md +32 -0
- package/packs/js-ts/rules/typed-exports.md +27 -0
- package/packs/js-ts/rules/types-once-at-the-edge.md +18 -0
- package/packs/js-ts/rules/unions-over-enums.md +29 -0
- package/packs/js-ts/rules/zod-at-route-boundaries.md +40 -0
- package/packs/midi/checks/active-sensing-no-pulse.json +24 -0
- package/packs/midi/checks/clock-not-at-sample-zero.json +23 -0
- package/packs/midi/checks/midi-realtime-first.json +27 -0
- package/packs/midi/checks/no-tempo-writeback.json +23 -0
- package/packs/midi/checks/position-not-integrated.json +25 -0
- package/packs/midi/checks/stub-playhead-advances.json +27 -0
- package/packs/midi/checks/sysex-length-literal.json +23 -0
- package/packs/midi/checks/sysex-not-on-audio.json +24 -0
- package/packs/midi/checks/sysex-survives-realtime.json +27 -0
- package/packs/midi/pack.json +22 -0
- package/packs/midi/rules/clock-is-a-pulse-stream.md +30 -0
- package/packs/midi/rules/imports-count-every-loss.md +25 -0
- package/packs/midi/rules/measure-the-clock-in-audio.md +30 -0
- package/packs/midi/rules/sync-is-a-mode.md +29 -0
- package/packs/midi/rules/sysex-is-a-record.md +29 -0
- package/packs/midi/skills/clock-probe/SKILL.md +23 -0
- package/packs/midi/skills/clock-probe/clock-law.md +417 -0
- package/packs/midi/skills/does-it-sync/SKILL.md +19 -0
- package/packs/mongo/checks/bulk-over-many.json +28 -0
- package/packs/mongo/checks/created-at-immutable.json +25 -0
- package/packs/mongo/checks/driver-outside-gateway.json +24 -0
- package/packs/mongo/checks/key-lookup-is-hashed.json +24 -0
- package/packs/mongo/checks/mongoclient-cached-and-named.json +34 -0
- package/packs/mongo/checks/mongoclient-outside-gateway.json +24 -0
- package/packs/mongo/checks/no-count-plus-one-ids.json +25 -0
- package/packs/mongo/checks/no-db-write-in-loop.json +25 -0
- package/packs/mongo/checks/no-drop-in-code.json +27 -0
- package/packs/mongo/checks/no-empty-deletemany.json +26 -0
- package/packs/mongo/checks/no-find-reads.json +26 -0
- package/packs/mongo/checks/no-input-spread-into-write.json +24 -0
- package/packs/mongo/checks/no-mongoose.json +23 -0
- package/packs/mongo/checks/no-negation-delete.json +26 -0
- package/packs/mongo/checks/no-non-null-after-findone.json +25 -0
- package/packs/mongo/checks/objectid-equals.json +26 -0
- package/packs/mongo/checks/update-then-reread.json +24 -0
- package/packs/mongo/checks/watch-not-poll.json +25 -0
- package/packs/mongo/pack.json +52 -0
- package/packs/mongo/rules/deletes-name-what-dies.md +21 -0
- package/packs/mongo/rules/driver-only-in-gateway.md +26 -0
- package/packs/mongo/rules/keys-hashed-input-picked.md +21 -0
- package/packs/mongo/rules/one-client-one-pool.md +32 -0
- package/packs/mongo/rules/reads-aggregate-writes-bulk.md +25 -0
- package/packs/mongo/rules/writes-are-atomic.md +27 -0
- package/packs/multi-tenant/checks/role-sees-all-tenants.json +26 -0
- package/packs/multi-tenant/checks/tenant-filter-from-url.json +25 -0
- package/packs/multi-tenant/pack.json +22 -0
- package/packs/multi-tenant/rules/no-role-crosses-a-tenant.md +21 -0
- package/packs/multi-tenant/skills/prove-tenant-isolation/SKILL.md +19 -0
- package/packs/nginx/checks/modsec-no-blanket-off.json +16 -0
- package/packs/nginx/checks/nginx-csp-no-unsafe.json +15 -0
- package/packs/nginx/checks/nginx-headers-always.json +15 -0
- package/packs/nginx/checks/nginx-keepalive-http11.json +20 -0
- package/packs/nginx/checks/nginx-logs-to-stdout.json +15 -0
- package/packs/nginx/checks/nginx-no-crlf.json +17 -0
- package/packs/nginx/checks/nginx-resolver-ttl.json +19 -0
- package/packs/nginx/pack.json +43 -0
- package/packs/nginx/rules/modsecurity-tuning.md +22 -0
- package/packs/nginx/rules/nginx-production.md +26 -0
- package/packs/nginx/skills/waf-rollout/SKILL.md +20 -0
- package/packs/python/checks/py-no-bare-except.json +18 -0
- package/packs/python/checks/py-no-eval.json +18 -0
- package/packs/python/checks/py-no-mutable-default.json +18 -0
- package/packs/python/checks/py-no-shell-true.json +18 -0
- package/packs/python/checks/py-no-star-import.json +18 -0
- package/packs/python/checks/py-no-swallowed-exception.json +18 -0
- package/packs/python/checks/py-none-by-is.json +18 -0
- package/packs/python/checks/py-open-with-with.json +18 -0
- package/packs/python/checks/py-requests-timeout.json +18 -0
- package/packs/python/checks/py-subprocess-output-checked.json +18 -0
- package/packs/python/checks/py-yaml-safe-load.json +18 -0
- package/packs/python/pack.json +26 -0
- package/packs/python/rules/python-errors-and-resources.md +26 -0
- package/packs/python/rules/python-repeats-become-templates.md +27 -0
- package/packs/python/skills/python-extract-template/SKILL.md +35 -0
- package/packs/react/checks/dialog-needs-role.json +28 -0
- package/packs/react/checks/effect-not-for-derived-state.json +24 -0
- package/packs/react/checks/icon-button-needs-name.json +24 -0
- package/packs/react/checks/label-needs-a-field.json +24 -0
- package/packs/react/checks/ui-failed-fetch-says-so.json +23 -0
- package/packs/react/checks/ui-ok-branch-has-an-else.json +23 -0
- package/packs/react/pack.json +20 -0
- package/packs/react/rules/react-accessible-controls.md +20 -0
- package/packs/react/rules/react-state-and-effects.md +23 -0
- package/packs/reverse-engineering/checks/ear-constant-tagged.json +23 -0
- package/packs/reverse-engineering/checks/no-default-on-distrust.json +24 -0
- package/packs/reverse-engineering/checks/no-rom-table-literal.json +29 -0
- package/packs/reverse-engineering/checks/prose-never-decides.json +22 -0
- package/packs/reverse-engineering/hooks/firmware-out-of-git.mjs +49 -0
- package/packs/reverse-engineering/pack.json +35 -0
- package/packs/reverse-engineering/rules/a-negative-names-what-was-scanned.md +19 -0
- package/packs/reverse-engineering/rules/account-every-term.md +20 -0
- package/packs/reverse-engineering/rules/addresses-name-their-space.md +21 -0
- package/packs/reverse-engineering/rules/every-law-has-a-source.md +18 -0
- package/packs/reverse-engineering/rules/findings-are-withdrawn-in-place.md +17 -0
- package/packs/reverse-engineering/rules/firmware-stays-out.md +18 -0
- package/packs/reverse-engineering/rules/names-before-code.md +19 -0
- package/packs/reverse-engineering/rules/reproduction-or-original.md +18 -0
- package/packs/reverse-engineering/rules/two-sources-before-naming.md +21 -0
- package/packs/reverse-engineering/skills/bank-census/SKILL.md +18 -0
- package/packs/reverse-engineering/skills/gather-sources/SKILL.md +21 -0
- package/packs/reverse-engineering/skills/menu-map/SKILL.md +28 -0
- package/packs/reverse-engineering/skills/names-first/SKILL.md +41 -0
- package/packs/reverse-engineering/skills/re-deliverables/SKILL.md +21 -0
- package/packs/reverse-engineering/skills/tripwire-the-law/SKILL.md +19 -0
- package/packs/reverse-engineering/tools/lib/unwrap.mjs +115 -0
- package/packs/reverse-engineering/tools/names-sweep.mjs +264 -0
- package/packs/shell/checks/sh-mktemp.json +18 -0
- package/packs/shell/checks/sh-no-backticks.json +18 -0
- package/packs/shell/checks/sh-no-eval.json +18 -0
- package/packs/shell/checks/sh-no-parse-ls.json +18 -0
- package/packs/shell/checks/sh-no-pipe-to-shell.json +18 -0
- package/packs/shell/checks/sh-no-program-in-heredoc.json +18 -0
- package/packs/shell/checks/sh-quote-arguments.json +18 -0
- package/packs/shell/checks/sh-rm-guarded.json +18 -0
- package/packs/shell/checks/sh-strict-mode.json +20 -0
- package/packs/shell/pack.json +28 -0
- package/packs/shell/rules/shell-repeats-become-templates.md +23 -0
- package/packs/shell/rules/shell-strict-and-quoted.md +27 -0
- package/packs/shell/skills/shell-extract-template/SKILL.md +32 -0
- package/packs/shell-hooks/checks/gnu-only-in-shell.json +18 -0
- package/packs/shell-hooks/checks/hook-command-anchored.json +12 -0
- package/packs/shell-hooks/checks/hook-json-by-tool.json +18 -0
- package/packs/shell-hooks/checks/no-bash-c-with-variable.json +20 -0
- package/packs/shell-hooks/pack.json +36 -0
- package/packs/shell-hooks/rules/hooks-portable-anchored-quoted.md +26 -0
- package/packs/sound-design/checks/audio-seed-fixed.json +23 -0
- package/packs/sound-design/checks/mix-is-a-crossfade.json +30 -0
- package/packs/sound-design/checks/no-hash-in-the-signal.json +30 -0
- package/packs/sound-design/checks/no-literal-key-anchor.json +30 -0
- package/packs/sound-design/checks/test-compares-a-function-with-itself.json +22 -0
- package/packs/sound-design/pack.json +22 -0
- package/packs/sound-design/rules/algorithms-are-data.md +26 -0
- package/packs/sound-design/rules/meter-before-engine.md +27 -0
- package/packs/sound-design/rules/neutral-is-exact.md +26 -0
- package/packs/sound-design/rules/test-off-the-easy-point.md +28 -0
- package/packs/sound-design/rules/unreachable-is-said.md +25 -0
- package/packs/sound-design/rules/waveforms-and-octaves.md +24 -0
- package/packs/sound-design/skills/choose-observable/SKILL.md +18 -0
- package/packs/sound-design/skills/measure-a-law/SKILL.md +18 -0
- package/packs/sound-design/skills/measure-reverb/SKILL.md +19 -0
- package/packs/sound-design/skills/spread-probe/SKILL.md +18 -0
- package/packs/stellix/checks/no-keyboard-focus.json +12 -0
- package/packs/stellix/checks/one-seeded-random.json +16 -0
- package/packs/stellix/checks/world-never-includes-painter.json +12 -0
- package/packs/stellix/checks/world-no-libm.json +15 -0
- package/packs/stellix/checks/world-no-unordered.json +10 -0
- package/packs/stellix/hooks/no-shipped-images.mjs +88 -0
- package/packs/stellix/pack.json +61 -0
- package/packs/stellix/rules/stellix-deterministic-world.md +29 -0
- package/packs/stellix/rules/stellix-reset-generated.md +24 -0
- package/packs/stellix/rules/stellix-world-snapshot.md +27 -0
- package/packs/stellix/rules/world-continuous-collision.md +26 -0
- package/packs/stellix/rules/world-fp-determinism.md +28 -0
- package/packs/stored-text/checks/no-raw-html-from-data.json +31 -0
- package/packs/stored-text/checks/stored-text-libs-only-in-renderer.json +31 -0
- package/packs/stored-text/checks/stored-text-renderer-complete.json +24 -0
- package/packs/stored-text/checks/stored-text-through-renderer.json +25 -0
- package/packs/stored-text/pack.json +41 -0
- package/packs/stored-text/rules/stored-text-renders-once.md +26 -0
- package/packs/stored-text/skills/render-stored-text/SKILL.md +24 -0
- package/packs/synth-creator/checks/timing-from-synthcore.json +24 -0
- package/packs/synth-creator/checks/ui-drawn-in-code.json +23 -0
- package/packs/synth-creator/hooks/build-guard.mjs +232 -0
- package/packs/synth-creator/hooks/build-sweep.mjs +166 -0
- package/packs/synth-creator/hooks/frozen-files.mjs +63 -0
- package/packs/synth-creator/hooks/idle-wake.mjs +90 -0
- package/packs/synth-creator/hooks/protect-vendor.mjs +174 -0
- package/packs/synth-creator/hooks/spec-lock.mjs +117 -0
- package/packs/synth-creator/hooks/stage-guard.mjs +50 -0
- package/packs/synth-creator/hooks/time-guard.mjs +292 -0
- package/packs/synth-creator/hooks/user-asks.mjs +165 -0
- package/packs/synth-creator/pack.json +136 -0
- package/packs/synth-creator/rules/copy-trees-read-only.md +25 -0
- package/packs/synth-creator/rules/debug-by-measurement.md +20 -0
- package/packs/synth-creator/rules/done-means-fresh-evidence.md +18 -0
- package/packs/synth-creator/rules/hooks-and-gates.md +21 -0
- package/packs/synth-creator/rules/long-work-in-the-background.md +16 -0
- package/packs/synth-creator/rules/timing-from-synthcore.md +16 -0
- package/packs/synth-creator/skills/build-step/SKILL.md +125 -0
- package/packs/synth-creator/skills/build-through-the-queue/SKILL.md +19 -0
- package/packs/synth-creator/tools/freeze.mjs +36 -0
- package/packs/tui/checks/tui-entry-restores-terminal.json +27 -0
- package/packs/tui/checks/tui-gates-on-tty.json +25 -0
- package/packs/tui/checks/tui-no-ris-reset.json +22 -0
- package/packs/tui/checks/tui-resize-listener-removed.json +26 -0
- package/packs/tui/checks/tui-width-is-state.json +33 -0
- package/packs/tui/pack.json +44 -0
- package/packs/tui/rules/tui-resize-and-screen.md +25 -0
- package/packs/tui/skills/build-tui/SKILL.md +21 -0
- package/packs/ui-craft/checks/ui-input-needs-autocomplete.json +23 -0
- package/packs/ui-craft/checks/ui-intl-for-dates.json +21 -0
- package/packs/ui-craft/checks/ui-no-ai-palette.json +22 -0
- package/packs/ui-craft/checks/ui-no-animate-layout.json +22 -0
- package/packs/ui-craft/checks/ui-no-assistant-palette.json +23 -0
- package/packs/ui-craft/checks/ui-no-bounce-easing.json +22 -0
- package/packs/ui-craft/checks/ui-no-custom-cursor.json +22 -0
- package/packs/ui-craft/checks/ui-no-emoji-as-ui.json +22 -0
- package/packs/ui-craft/checks/ui-no-empty-image.json +21 -0
- package/packs/ui-craft/checks/ui-no-eyebrow.json +21 -0
- package/packs/ui-craft/checks/ui-no-furniture-text.json +22 -0
- package/packs/ui-craft/checks/ui-no-gradient-text.json +22 -0
- package/packs/ui-craft/checks/ui-no-index-numbering.json +21 -0
- package/packs/ui-craft/checks/ui-no-lorem.json +22 -0
- package/packs/ui-craft/checks/ui-no-marketing-buzzword.json +22 -0
- package/packs/ui-craft/checks/ui-no-paste-block.json +21 -0
- package/packs/ui-craft/checks/ui-no-placeholder-names.json +21 -0
- package/packs/ui-craft/checks/ui-no-scroll-hijack.json +21 -0
- package/packs/ui-craft/checks/ui-no-side-tab.json +21 -0
- package/packs/ui-craft/checks/ui-no-stock-labels.json +22 -0
- package/packs/ui-craft/checks/ui-no-transition-all.json +22 -0
- package/packs/ui-craft/checks/ui-no-uppercase-table-header.json +21 -0
- package/packs/ui-craft/checks/ui-no-zebra-rows.json +22 -0
- package/packs/ui-craft/checks/ui-no-zoom-lock.json +21 -0
- package/packs/ui-craft/pack.json +43 -0
- package/packs/ui-craft/rules/apps-are-not-pages.md +26 -0
- package/packs/ui-craft/rules/data-tells-the-truth.md +26 -0
- package/packs/ui-craft/rules/dates-and-numbers.md +18 -0
- package/packs/ui-craft/rules/forms-never-fight.md +22 -0
- package/packs/ui-craft/rules/interface-copy.md +26 -0
- package/packs/ui-craft/rules/motion-is-rare.md +31 -0
- package/packs/ui-craft/rules/no-generated-look.md +37 -0
- package/packs/ui-craft/rules/page-holds-its-frame.md +28 -0
- package/packs/ui-craft/rules/page-proved-rendered.md +19 -0
- package/packs/ui-craft/rules/pictures-do-a-job.md +25 -0
- package/packs/ui-craft/rules/pointer-feedback.md +28 -0
- package/packs/ui-craft/rules/screen-answers-one-question.md +24 -0
- package/packs/ui-craft/rules/survives-real-data.md +23 -0
- package/packs/ui-craft/rules/touch-and-small-screens.md +19 -0
- package/packs/ui-craft/rules/type-space-colour.md +26 -0
- package/packs/ui-craft/rules/url-holds-the-state.md +19 -0
- package/packs/ui-craft/skills/app-screen/SKILL.md +33 -0
- package/packs/ui-craft/skills/build-from-reference/SKILL.md +28 -0
- package/packs/ui-craft/skills/chart-choice/SKILL.md +34 -0
- package/packs/ui-craft/skills/hover-state/SKILL.md +28 -0
- package/packs/ui-craft/skills/page-critique/SKILL.md +33 -0
- package/packs/ui-craft/skills/prove-page/SKILL.md +23 -0
- package/packs/ui-craft/skills/redesign-page/SKILL.md +19 -0
- package/packs/ui-craft/skills/ui-code-review/SKILL.md +22 -0
- package/packs/ui-craft/skills/write-the-page/SKILL.md +21 -0
- package/packs/ui-craft/tools/page-measure.mjs +41 -0
- package/packs/web/checks/a11y-img-needs-alt.json +26 -0
- package/packs/web/checks/a11y-no-bare-outline-none.json +21 -0
- package/packs/web/checks/a11y-no-clickable-div.json +26 -0
- package/packs/web/checks/a11y-no-positive-tabindex.json +26 -0
- package/packs/web/checks/client-no-api-key.json +29 -0
- package/packs/web/checks/client-no-browser-global-at-module-scope.json +28 -0
- package/packs/web/checks/client-no-server-import.json +31 -0
- package/packs/web/checks/client-no-window-location-nav.json +28 -0
- package/packs/web/checks/css-no-inline-style.json +30 -0
- package/packs/web/checks/ds-pages-compose-primitives.json +28 -0
- package/packs/web/checks/key-from-index.json +23 -0
- package/packs/web/checks/prodbuild-no-cdn-runtime-deps.json +21 -0
- package/packs/web/checks/prodbuild-no-dev-flags.json +21 -0
- package/packs/web/checks/prodbuild-no-remote-fonts.json +22 -0
- package/packs/web/checks/rcss-button-cursor.json +30 -0
- package/packs/web/checks/rcss-no-100vw.json +21 -0
- package/packs/web/checks/rcss-no-fixed-wide-width.json +21 -0
- package/packs/web/checks/rcss-viewport-meta.json +28 -0
- package/packs/web/checks/secret-not-in-web-storage.json +25 -0
- package/packs/web/checks/tw-no-raw-hex-in-markup.json +34 -0
- package/packs/web/checks/wp-hero-not-lazy.json +27 -0
- package/packs/web/checks/wp-img-needs-dimensions.json +26 -0
- package/packs/web/pack.json +73 -0
- package/packs/web/rules/accessibility.md +26 -0
- package/packs/web/rules/client-boundaries.md +23 -0
- package/packs/web/rules/production-build.md +22 -0
- package/packs/web/rules/secrets-not-in-the-browser.md +18 -0
- package/packs/web/rules/styles-live-in-stylesheets.md +23 -0
- package/packs/web/rules/tailwind-v4.md +23 -0
- package/packs/web/rules/ui-primitives-one-module.md +30 -0
- package/packs/web/rules/web-performance.md +21 -0
- package/packs/web/skills/design-direction/SKILL.md +30 -0
- package/packs/web/skills/design-review/SKILL.md +28 -0
- package/packs/web/skills/pick-rendering-mode/SKILL.md +21 -0
- package/packs/web/skills/preflight-build/SKILL.md +23 -0
- package/packs/web/skills/seo-audit/SKILL.md +22 -0
- package/packs/websocket/checks/no-token-in-query.json +26 -0
- package/packs/websocket/checks/stale-socket-deletes-new-entry.json +25 -0
- package/packs/websocket/checks/ws-identity-from-message.json +26 -0
- package/packs/websocket/pack.json +21 -0
- package/packs/websocket/rules/identity-comes-from-the-connection.md +24 -0
- package/packs/writing/checks/ascii-no-em-dash.json +17 -0
- package/packs/writing/checks/no-copula-dodging.json +18 -0
- package/packs/writing/checks/no-dramatic-colon.json +18 -0
- package/packs/writing/checks/no-not-x-but-y.json +18 -0
- package/packs/writing/checks/no-participial-opener.json +18 -0
- package/packs/writing/checks/no-pseudo-wisdom.json +18 -0
- package/packs/writing/checks/no-slop-words.json +18 -0
- package/packs/writing/checks/no-stock-connectors.json +18 -0
- package/packs/writing/checks/no-time-or-date.json +27 -0
- package/packs/writing/checks/no-trailing-ing.json +18 -0
- package/packs/writing/checks/no-vague-attribution.json +18 -0
- package/packs/writing/pack.json +43 -0
- package/packs/writing/rules/ascii-no-em-dash.md +21 -0
- package/packs/writing/rules/cut-the-padding.md +20 -0
- package/packs/writing/rules/direct-voice.md +22 -0
- package/packs/writing/rules/no-cargo-cult.md +16 -0
- package/packs/writing/rules/no-scaffolding.md +19 -0
- package/packs/writing/rules/no-stock-language.md +27 -0
- package/packs/writing/rules/no-time-or-date.md +18 -0
- package/packs/writing/rules/rhythm-like-talk.md +20 -0
- package/packs/writing/rules/write-from-your-own-corner.md +20 -0
- package/packs/writing/skills/argument-post/SKILL.md +28 -0
- package/packs/writing/skills/humanize/SKILL.md +28 -0
- package/packs/writing/skills/launch-post/SKILL.md +38 -0
- package/packs/writing/skills/pick-subreddit/SKILL.md +69 -0
- package/packs/writing/skills/post-voice/SKILL.md +22 -0
- package/packs/writing/skills/reddit-post/SKILL.md +63 -0
- package/packs/writing/skills/reddit-title/SKILL.md +23 -0
- package/packs/writing/skills/reply-moves/SKILL.md +40 -0
- package/packs/writing/skills/reply-stance/SKILL.md +23 -0
- package/packs/writing/skills/should-i-reply/SKILL.md +21 -0
- package/packs/zod/hooks/schemas-only.mjs +53 -0
- package/packs/zod/pack.json +44 -0
- package/packs/zod/rules/env-shapes-only.md +14 -0
- package/packs/zod/rules/zod-4-schemas.md +14 -0
- package/profiles/stellix.layout.json +315 -0
- package/profiles/sub37.layout.json +247 -0
- package/prompts/scan-review.md +40 -0
- package/prompts/survey.md +82 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "rcss-no-100vw",
|
|
3
|
+
"why": "100vw includes the scrollbar, so a 100vw box overflows sideways on every desktop browser. width: 100%.",
|
|
4
|
+
"rule": ".claude/rules/styles-live-in-stylesheets.md",
|
|
5
|
+
"concepts": [
|
|
6
|
+
"styles"
|
|
7
|
+
],
|
|
8
|
+
"exclude": [
|
|
9
|
+
"**/node_modules/**",
|
|
10
|
+
"**/dist/**",
|
|
11
|
+
"**/build/**",
|
|
12
|
+
"**/.next/**",
|
|
13
|
+
"**/out/**",
|
|
14
|
+
".claude/**",
|
|
15
|
+
"**/.claude/**"
|
|
16
|
+
],
|
|
17
|
+
"code": false,
|
|
18
|
+
"pattern": "\\b100vw\\b",
|
|
19
|
+
"bad": ".hero { width: 100vw; }",
|
|
20
|
+
"good": ".hero { width: 100%; }"
|
|
21
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "rcss-no-fixed-wide-width",
|
|
3
|
+
"why": "A fixed width of 500px or more is wider than a phone; the layout scrolls sideways. max-width, %, or min(800px, 100%).",
|
|
4
|
+
"rule": ".claude/rules/styles-live-in-stylesheets.md",
|
|
5
|
+
"concepts": [
|
|
6
|
+
"styles"
|
|
7
|
+
],
|
|
8
|
+
"exclude": [
|
|
9
|
+
"**/node_modules/**",
|
|
10
|
+
"**/dist/**",
|
|
11
|
+
"**/build/**",
|
|
12
|
+
"**/.next/**",
|
|
13
|
+
"**/out/**",
|
|
14
|
+
".claude/**",
|
|
15
|
+
"**/.claude/**"
|
|
16
|
+
],
|
|
17
|
+
"code": false,
|
|
18
|
+
"pattern": "(?<![\\w-])(?:min-)?width\\s*:\\s*(?:[5-9]\\d{2}|\\d{4,})px",
|
|
19
|
+
"bad": ".card { width: 640px; }",
|
|
20
|
+
"good": ".card { max-width: 640px; width: min(640px, 100%); }"
|
|
21
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "rcss-viewport-meta",
|
|
3
|
+
"why": "Without the viewport meta the page renders at 980px and is zoomed out on every phone. Next's app router emits it; a hand-written document must.",
|
|
4
|
+
"rule": ".claude/rules/styles-live-in-stylesheets.md",
|
|
5
|
+
"globs": [
|
|
6
|
+
"**/index.html",
|
|
7
|
+
"**/_document.tsx",
|
|
8
|
+
"**/root.tsx",
|
|
9
|
+
"**/app.html"
|
|
10
|
+
],
|
|
11
|
+
"exclude": [
|
|
12
|
+
"**/node_modules/**",
|
|
13
|
+
"**/dist/**",
|
|
14
|
+
"**/build/**",
|
|
15
|
+
"**/.next/**",
|
|
16
|
+
"**/out/**",
|
|
17
|
+
".claude/**",
|
|
18
|
+
"**/.claude/**"
|
|
19
|
+
],
|
|
20
|
+
"code": false,
|
|
21
|
+
"mode": "needs",
|
|
22
|
+
"pattern": "<html\\b",
|
|
23
|
+
"needs": [
|
|
24
|
+
"width=device-width"
|
|
25
|
+
],
|
|
26
|
+
"bad": "<html lang=\"en\"><head><title>x</title></head></html>",
|
|
27
|
+
"good": "<html lang=\"en\"><head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" /></head></html>"
|
|
28
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "secret-not-in-web-storage",
|
|
3
|
+
"why": "The key that makes the privacy claim true should not be readable by every third-party script on the page.",
|
|
4
|
+
"rule": ".claude/rules/secrets-not-in-the-browser.md",
|
|
5
|
+
"globs": [
|
|
6
|
+
"**/*.tsx",
|
|
7
|
+
"**/*.jsx",
|
|
8
|
+
"**/client/**/*.ts"
|
|
9
|
+
],
|
|
10
|
+
"exclude": [
|
|
11
|
+
"**/tests/**",
|
|
12
|
+
"**/test/**",
|
|
13
|
+
"**/*.test.*",
|
|
14
|
+
"**/*.spec.*",
|
|
15
|
+
"**/e2e/**",
|
|
16
|
+
"**/node_modules/**",
|
|
17
|
+
"**/dist/**",
|
|
18
|
+
"**/build/**",
|
|
19
|
+
"**/.next/**"
|
|
20
|
+
],
|
|
21
|
+
"code": true,
|
|
22
|
+
"pattern": "(?:local|session)Storage\\.setItem\\([^,\\n]+,\\s*\\w*(?:[kK]ey(?:Input)?|[tT]oken|[sS]ecret|[pP]assword)\\w*\\s*\\)",
|
|
23
|
+
"bad": "localStorage.setItem(STORAGE_KEY, keyInput);",
|
|
24
|
+
"good": "localStorage.setItem(THEME_KEY, theme);"
|
|
25
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "tw-no-raw-hex-in-markup",
|
|
3
|
+
"why": "A hex colour in a page or component is a value outside the token system; it drifts and has no dark: pair. Declare it once in @theme and use the utility.",
|
|
4
|
+
"rule": ".claude/rules/ui-primitives-one-module.md",
|
|
5
|
+
"globs": [
|
|
6
|
+
"**/*.tsx",
|
|
7
|
+
"**/*.jsx"
|
|
8
|
+
],
|
|
9
|
+
"exclude": [
|
|
10
|
+
"**/node_modules/**",
|
|
11
|
+
"**/dist/**",
|
|
12
|
+
"**/build/**",
|
|
13
|
+
"**/.next/**",
|
|
14
|
+
"**/out/**",
|
|
15
|
+
".claude/**",
|
|
16
|
+
"**/.claude/**",
|
|
17
|
+
"**/*.test.*",
|
|
18
|
+
"**/*.spec.*",
|
|
19
|
+
"**/test/**",
|
|
20
|
+
"**/tests/**",
|
|
21
|
+
"**/*.stories.*",
|
|
22
|
+
"**/tokens*",
|
|
23
|
+
"**/theme*",
|
|
24
|
+
"**/components/ui/**",
|
|
25
|
+
"**/email/**",
|
|
26
|
+
"**/emails/**",
|
|
27
|
+
"**/mail/**"
|
|
28
|
+
],
|
|
29
|
+
"code": false,
|
|
30
|
+
"pattern": "#[0-9a-fA-F]{6}\\b",
|
|
31
|
+
"bad": "<div className=\"bg-[#1f2937]\">",
|
|
32
|
+
"good": "<div className=\"bg-surface-2\">",
|
|
33
|
+
"kind": "quality"
|
|
34
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "wp-hero-not-lazy",
|
|
3
|
+
"why": "loading=\"lazy\" or fetchpriority=\"low\" on the hero delays the very element LCP measures. Preload it and mark it fetchpriority=\"high\".",
|
|
4
|
+
"rule": ".claude/rules/web-performance.md",
|
|
5
|
+
"concepts": [
|
|
6
|
+
"markup"
|
|
7
|
+
],
|
|
8
|
+
"exclude": [
|
|
9
|
+
"**/node_modules/**",
|
|
10
|
+
"**/dist/**",
|
|
11
|
+
"**/build/**",
|
|
12
|
+
"**/.next/**",
|
|
13
|
+
"**/out/**",
|
|
14
|
+
".claude/**",
|
|
15
|
+
"**/.claude/**",
|
|
16
|
+
"**/*.test.*",
|
|
17
|
+
"**/*.spec.*",
|
|
18
|
+
"**/test/**",
|
|
19
|
+
"**/tests/**",
|
|
20
|
+
"**/*.stories.*"
|
|
21
|
+
],
|
|
22
|
+
"code": false,
|
|
23
|
+
"flags": "i",
|
|
24
|
+
"pattern": "fetchpriority=.?low[^>]*hero|hero[^>]*loading=.?lazy",
|
|
25
|
+
"bad": "<img class=\"hero\" src=\"/hero.avif\" loading=\"lazy\">",
|
|
26
|
+
"good": "<img class=\"hero\" src=\"/hero.avif\" fetchpriority=\"high\" width=\"1600\" height=\"900\" alt=\"\u2026\">"
|
|
27
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "wp-img-needs-dimensions",
|
|
3
|
+
"why": "An <img> without width and height reserves no box, so the layout shifts when it arrives (CLS). Give it intrinsic dimensions; the stylesheet keeps it fluid with max-width: 100%; height: auto.",
|
|
4
|
+
"rule": ".claude/rules/web-performance.md",
|
|
5
|
+
"concepts": [
|
|
6
|
+
"markup"
|
|
7
|
+
],
|
|
8
|
+
"exclude": [
|
|
9
|
+
"**/node_modules/**",
|
|
10
|
+
"**/dist/**",
|
|
11
|
+
"**/build/**",
|
|
12
|
+
"**/.next/**",
|
|
13
|
+
"**/out/**",
|
|
14
|
+
".claude/**",
|
|
15
|
+
"**/.claude/**",
|
|
16
|
+
"**/*.test.*",
|
|
17
|
+
"**/*.spec.*",
|
|
18
|
+
"**/test/**",
|
|
19
|
+
"**/tests/**",
|
|
20
|
+
"**/*.stories.*"
|
|
21
|
+
],
|
|
22
|
+
"code": false,
|
|
23
|
+
"pattern": "<img\\b(?![^>]*\\bwidth\\s*=)[^>]*>",
|
|
24
|
+
"bad": "<img src=\"/a.png\" alt=\"a\">",
|
|
25
|
+
"good": "<img src=\"/a.png\" alt=\"a\" width=\"320\" height=\"200\">"
|
|
26
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "web",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Web UI (Next.js, HTML, CSS, Tailwind 4): accessibility, one primitives module, styles in stylesheets, performance, production build, client boundaries.",
|
|
5
|
+
"type": "stock",
|
|
6
|
+
"author": "claude-packs",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"homepage": "https://github.com/TheDecipherist/claude-packs",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "https://github.com/TheDecipherist/claude-packs.git",
|
|
12
|
+
"directory": "packs/web"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"nextjs",
|
|
16
|
+
"react",
|
|
17
|
+
"css"
|
|
18
|
+
],
|
|
19
|
+
"engines": {
|
|
20
|
+
"claude-packs": ">=0.19.0"
|
|
21
|
+
},
|
|
22
|
+
"folders": {},
|
|
23
|
+
"concepts": {
|
|
24
|
+
"markup": [
|
|
25
|
+
"**/*.tsx",
|
|
26
|
+
"**/*.jsx",
|
|
27
|
+
"**/*.html",
|
|
28
|
+
"**/*.vue",
|
|
29
|
+
"**/*.svelte"
|
|
30
|
+
],
|
|
31
|
+
"styles": [
|
|
32
|
+
"**/*.css",
|
|
33
|
+
"**/*.scss",
|
|
34
|
+
"**/styles/**",
|
|
35
|
+
"**/tailwind.config.*",
|
|
36
|
+
"**/postcss.config.*"
|
|
37
|
+
],
|
|
38
|
+
"pages": [
|
|
39
|
+
"**/app/**/page.tsx",
|
|
40
|
+
"**/app/**/layout.tsx",
|
|
41
|
+
"**/app/**/template.tsx",
|
|
42
|
+
"**/pages/**/*.tsx",
|
|
43
|
+
"**/pages/**/*.jsx",
|
|
44
|
+
"**/routes/**/*.tsx"
|
|
45
|
+
],
|
|
46
|
+
"components": [
|
|
47
|
+
"**/components/**",
|
|
48
|
+
"**/client/**"
|
|
49
|
+
],
|
|
50
|
+
"client": [
|
|
51
|
+
"**/app/**",
|
|
52
|
+
"**/components/**",
|
|
53
|
+
"**/client/**",
|
|
54
|
+
"**/public/**",
|
|
55
|
+
"**/*.tsx",
|
|
56
|
+
"**/*.jsx"
|
|
57
|
+
],
|
|
58
|
+
"build-config": [
|
|
59
|
+
"**/next.config.*",
|
|
60
|
+
"**/webpack*.js",
|
|
61
|
+
"**/webpack*.mjs",
|
|
62
|
+
"**/webpack*.cjs",
|
|
63
|
+
"**/webpack*.ts",
|
|
64
|
+
"**/rollup.config.*",
|
|
65
|
+
"**/esbuild*.js",
|
|
66
|
+
"**/esbuild*.mjs",
|
|
67
|
+
"**/index.html",
|
|
68
|
+
"**/_document.tsx"
|
|
69
|
+
]
|
|
70
|
+
},
|
|
71
|
+
"skillsIn": null,
|
|
72
|
+
"hooks": {}
|
|
73
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
# concepts: markup, styles
|
|
3
|
+
paths:
|
|
4
|
+
- "placeholder"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Accessibility is built in with the right element, never bolted on
|
|
8
|
+
|
|
9
|
+
Most of it costs nothing if the right element is used from the start. The defaults that break screen readers and keyboards (clickable divs, missing labels, removed focus rings) are expensive to retrofit.
|
|
10
|
+
|
|
11
|
+
<constraints>
|
|
12
|
+
Always do:
|
|
13
|
+
- The native element: `<button>` for actions, `<a href>` for navigation, `<nav>`, `<ul>`, `<label>`, `<input>`, `<dialog>` with `showModal()`. ARIA only when no native element does the job; bad ARIA is worse than none.
|
|
14
|
+
- An accessible name on every interactive thing: descriptive `alt` (or `alt=""` for decorative, never omitted: that reads the filename); a real `<label>` tied to each field (a placeholder is not a label); `aria-label` on icon-only buttons.
|
|
15
|
+
- Keyboard: `:focus-visible` styles that replace, never remove, the focus ring; focus moved to the new view's heading on route change and into a modal on open.
|
|
16
|
+
- Structure: one `<h1>`, then `<h2>`/`<h3>` in order (never skipped for size); landmarks `<header>`, `<nav>`, one `<main>`, `<footer>`, a skip-to-content link; `<section>` only with a heading.
|
|
17
|
+
- Contrast 4.5:1 (3:1 large text), meaning never by colour alone, zoom never disabled, `prefers-reduced-motion` respected, dynamic changes announced with `aria-live`.
|
|
18
|
+
- Vendor stylesheets (editors, pickers, charts): force `svg, svg * { fill: currentColor; stroke: currentColor }` inside the wrapper, and verify the surface **rendered, in both colour schemes**: the colour is in node_modules, not in your markup.
|
|
19
|
+
- Contrast is verified rendered (both schemes) by a Playwright check, never by grepping colour classes: a grep passes cleanly in exactly the failing case.
|
|
20
|
+
|
|
21
|
+
Never do:
|
|
22
|
+
- `<div onClick>` / `<span onClick>` (`a11y-no-clickable-div`): not focusable, no Enter/Space, announced as nothing.
|
|
23
|
+
- `tabindex` above 0 (`a11y-no-positive-tabindex`): it hijacks the tab order.
|
|
24
|
+
- `outline: none` or `outline: 0` (`a11y-no-bare-outline-none`) without a `:focus-visible` replacement in the same rule.
|
|
25
|
+
- `<img>` without `alt` (`a11y-img-needs-alt`).
|
|
26
|
+
</constraints>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
# concepts: client
|
|
3
|
+
paths:
|
|
4
|
+
- "placeholder"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# The client bundle holds no server code, no secrets, and navigates only through the router
|
|
8
|
+
|
|
9
|
+
<constraints>
|
|
10
|
+
Always do:
|
|
11
|
+
- Server-only code (the gateway, env, anything with a secret) reaches a `'use client'` component only through a server component's props, a route handler or a server action; `import type` from a server module is the one allowed import, and only under `verbatimModuleSyntax: true`.
|
|
12
|
+
- Browser globals (`window`, `document`, `localStorage`, `navigator`) inside effects, event handlers or behind `typeof window !== 'undefined'`; never at module scope, where the server render evaluates them.
|
|
13
|
+
- Internal navigation through the router (`<Link>`, `router.push`), so SPA state, prefetching and transitions survive. `window.location` only for external URLs and file downloads, marked `// allow location nav` on the line.
|
|
14
|
+
- Hydration data is initial-only: every client-side navigation target has its own data path (a route handler or server component fetch), or it renders stale or blank.
|
|
15
|
+
- Loader/props payloads are a projection shaped to what the component renders, never the service's full result: SSR embeds the data twice (HTML + hydration JSON).
|
|
16
|
+
- Verify once per feature that the client build contains no connection string, collection name or server env key.
|
|
17
|
+
|
|
18
|
+
Never do:
|
|
19
|
+
- A value import from `/server/`, `/db/`, `gateway`, `.server` in a `'use client'` file (`client-no-server-import`).
|
|
20
|
+
- `const x = window.…` / `document.…` at module scope (`client-no-browser-global-at-module-scope`).
|
|
21
|
+
- `window.location.href = '/…'`, `.assign`, `.replace`, `.reload` for an internal route (`client-no-window-location-nav`).
|
|
22
|
+
- An API key or `MONGODB_URI` anywhere under `app/`, `components/`, `client/`, `public/` (`client-no-api-key`).
|
|
23
|
+
</constraints>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
# concepts: build-config, markup, styles
|
|
3
|
+
paths:
|
|
4
|
+
- "placeholder"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# The production build serves from its own origin, hashed, minified, and runs once at the end
|
|
8
|
+
|
|
9
|
+
<constraints>
|
|
10
|
+
Always do:
|
|
11
|
+
- Development iterates on the dev server with hot reload; the **first** production build of a feature happens at final verification, against a freshly built and restarted prod app, because a class of bugs exists only there (CSP blocking an inline script, Secure cookies, static middleware serving the raw index, cache staleness).
|
|
12
|
+
- Fonts downloaded into the repo and served from the app's origin: `next/font` or `@fontsource`, woff2 only, `font-display: swap`, one critical face preloaded, old `preconnect` hints deleted.
|
|
13
|
+
- Runtime JS/CSS bundled or vendored; never a CDN `<script>`/`<link>` in a production page.
|
|
14
|
+
- Hashed filenames for every cacheable asset; CSS extracted to files, never injected by JS; chunks that always load together are one chunk; a `performance` budget that fails the build on regression.
|
|
15
|
+
- Modular imports (`lodash/merge`, not `lodash`); the bundle analyzer run when a heavy dependency is added.
|
|
16
|
+
- `preflight-build` before any deploy: it audits the **emitted** output (request count, third-party origins, hashing, size), not the config.
|
|
17
|
+
|
|
18
|
+
Never do:
|
|
19
|
+
- `fonts.googleapis.com`, `fonts.gstatic.com`, typekit, fontawesome CDN, bunny (`prodbuild-no-remote-fonts`).
|
|
20
|
+
- `unpkg`, `jsdelivr`, `cdnjs` in a shipped page (`prodbuild-no-cdn-runtime-deps`).
|
|
21
|
+
- `minify: false`, `mode: 'development'`, `productionBrowserSourceMaps: true` in the shipped config (`prodbuild-no-dev-flags`).
|
|
22
|
+
</constraints>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.tsx"
|
|
4
|
+
- "**/*.jsx"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Long-lived secrets stay out of browser storage
|
|
8
|
+
|
|
9
|
+
<constraints>
|
|
10
|
+
Always do:
|
|
11
|
+
- Keep sessions in `HttpOnly` cookies.
|
|
12
|
+
|
|
13
|
+
Never do:
|
|
14
|
+
- Put a refresh token or an API key in `localStorage`.
|
|
15
|
+
</constraints>
|
|
16
|
+
|
|
17
|
+
## Check
|
|
18
|
+
`secret-not-in-web-storage`.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
# concepts: markup, styles
|
|
3
|
+
paths:
|
|
4
|
+
- "placeholder"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Styles live in stylesheets, mobile-first, and every clickable thing shows a pointer
|
|
8
|
+
|
|
9
|
+
<constraints>
|
|
10
|
+
Always do:
|
|
11
|
+
- CSS in `.css` files (or CSS Modules / Tailwind utilities), linked and cached. Runtime values go in as a custom property (`style="--progress: 73%"`) consumed by the stylesheet; only the value is inline.
|
|
12
|
+
- `<meta name="viewport" content="width=device-width, initial-scale=1">` on every document that is not Next's app router (which emits it); `html { -webkit-text-size-adjust: 100% }`.
|
|
13
|
+
- Mobile-first: base styles small, `@media (min-width: …)` to enhance up. `box-sizing: border-box` globally.
|
|
14
|
+
- `min-width: 0` on flex and grid children (the fix for most mysterious horizontal scroll). `pre { overflow-x: auto; max-width: 100% }`, prose `overflow-wrap: break-word`.
|
|
15
|
+
- Fluid type with `clamp()`; `max-width`, `%` or `min(800px, 100%)` instead of fixed pixel widths; `width: 100%` never `100vw` (it includes the scrollbar); `img, video, svg { max-width: 100%; height: auto }` with intrinsic `width`/`height` on every `<img>`.
|
|
16
|
+
- iOS: `overscroll-behavior: contain` on scroll regions, `100dvh` not `100vh`, `font-size: 16px` on inputs (no focus zoom), pinch-zoom never disabled.
|
|
17
|
+
- `cursor: pointer` on everything clickable, in the base stylesheet: `button, [role="button"], [role="link"], [onclick] { cursor: pointer }`, `button:disabled { cursor: not-allowed }`. Buttons do not get it from the browser. The inverse holds: pointer on something inert is a lie.
|
|
18
|
+
|
|
19
|
+
Never do:
|
|
20
|
+
- `style="…"` attributes or large `style={{…}}` objects in markup (`css-no-inline-style`): they cannot be responsive, hover or animate, and start a specificity war. A single `<style>` block is fine only in a single-file deliverable; email HTML is the one case that requires inline.
|
|
21
|
+
- `100vw` (`rcss-no-100vw`); `width`/`min-width` of 500px or more (`rcss-no-fixed-wide-width`).
|
|
22
|
+
- A CSS reset that sets `button { cursor: default }` (several popular ones do).
|
|
23
|
+
</constraints>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
# concepts: styles
|
|
3
|
+
paths:
|
|
4
|
+
- "placeholder"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Tailwind 4: borders default to currentColor, unlayered CSS beats utilities, tokens live in @theme
|
|
8
|
+
|
|
9
|
+
Training-data idiom is v3. Three v4 differences shipped real visual bugs while every DOM test stayed green.
|
|
10
|
+
|
|
11
|
+
<constraints>
|
|
12
|
+
Always do:
|
|
13
|
+
- Restore a neutral border default once, in the global stylesheet: `@layer base { *, ::after, ::before, ::backdrop, ::file-selector-button { border-color: var(--color-slate-200, #e2e8f0); } }`. Load-bearing surfaces still name their colour (`border-slate-200 dark:border-slate-700`): a bare `border`/`divide-*` draws near-black in v4.
|
|
14
|
+
- Custom component CSS goes in `@layer components` (or base). Unlayered author CSS beats **every** utility regardless of order or specificity; a hand-written `.app-top-bar { padding-top: … }` silently zeroes `pt-14` on the same element.
|
|
15
|
+
- One owner per property per element: fold the utility's value into the custom class or drop the class; never split one box's property between the two.
|
|
16
|
+
- Tokens (palette, fonts, radii) declared once in `@theme` so utilities exist for them. A raw hex in a page or component is the drift the schema rule kills in data (`tw-no-raw-hex-in-markup`).
|
|
17
|
+
- Fonts are self-hosted: `next/font` or `@fontsource`, family registered in `@theme --font-sans`; prove it with a computed-style assert, the import alone proves nothing.
|
|
18
|
+
- Dark mode is one decision (`prefers-color-scheme` via `dark:` or a class toggle), recorded in the global stylesheet header; every surface that sets a light colour pairs its `dark:` value in the same edit.
|
|
19
|
+
|
|
20
|
+
Never do:
|
|
21
|
+
- Unlayered CSS that touches a property a utility also sets on that element.
|
|
22
|
+
- Remote font hosts (`prodbuild-no-remote-fonts`).
|
|
23
|
+
</constraints>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
# concepts: pages, components
|
|
3
|
+
paths:
|
|
4
|
+
- "placeholder"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# One UI primitives module; pages compose it and never hand-roll a control
|
|
8
|
+
|
|
9
|
+
People judge the product by its UI first: a styled, consistent surface makes everything else credible; an unstyled one gets no second look. The structural fix is the same as the schemas module and the database gateway: exactly one place where raw controls are styled.
|
|
10
|
+
|
|
11
|
+
<constraints>
|
|
12
|
+
Always do:
|
|
13
|
+
- One pinned primitives module (`src/components/ui/`): Button, Field (label + input/select with the shared field styling), Card, PageHeader, EmptyState, Modal/Sheet, and whatever the spec's component inventory names. Its barrel carries the header contract:
|
|
14
|
+
```ts
|
|
15
|
+
// UI PRIMITIVES: the ONLY place raw controls are styled. Pages compose these; never a bare
|
|
16
|
+
// button/input/select with ad-hoc classes. Tokens come from @theme. New primitive => new file here.
|
|
17
|
+
// Rule: ui-primitives-one-module.
|
|
18
|
+
```
|
|
19
|
+
- The primitives module ships in the **first** wave of any web build, before any page.
|
|
20
|
+
- Every page states its layout skeleton (container width, page header, section order, where the primary action sits) in its doc; two pages with the same kind of content use the same skeleton.
|
|
21
|
+
- One primary action per view, visually dominant; destructive actions in the red family and never adjacent-identical to safe ones; secondary actions quiet.
|
|
22
|
+
- Every list surface designs its empty state (first login **is** the demo); every async surface designs loading and error. `EmptyState` is a primitive so the designed version is one import away.
|
|
23
|
+
- Colour, spacing and type come from tokens; both colour schemes are first-class.
|
|
24
|
+
- When `design/` holds approved reference images, surfaces are built to match them; kit rules (contrast, a11y, self-hosted fonts) win over the image and the deviation is recorded.
|
|
25
|
+
|
|
26
|
+
Never do:
|
|
27
|
+
- `<button>`, `<input>`, `<select>`, `<textarea>` in a page or feature component (`ds-pages-compose-primitives`).
|
|
28
|
+
- A raw hex colour in a page or component (`tw-no-raw-hex-in-markup`).
|
|
29
|
+
- Ship a surface with zero styling classes: it is an automatic blocker in `design-review`.
|
|
30
|
+
</constraints>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
# concepts: markup, pages
|
|
3
|
+
paths:
|
|
4
|
+
- "placeholder"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Performance is decided up front: first paint first, everything else deferred
|
|
8
|
+
|
|
9
|
+
<constraints>
|
|
10
|
+
Always do:
|
|
11
|
+
- Split: critical (above the fold) in the initial HTML with inlined critical CSS, the LCP image preloaded with `fetchpriority="high"`, one critical font preloaded. Everything else deferred: `loading="lazy"` on below-fold images and iframes, `defer`/`async` scripts, dynamic imports for offscreen components, analytics late.
|
|
12
|
+
- Reserve space: `width` and `height` on every image (`wp-img-needs-dimensions`), `aspect-ratio` for backgrounds, `font-display` with a size-adjusted fallback. CLS is mostly "the space was not reserved".
|
|
13
|
+
- Images as WebP/AVIF through `<picture>` (or `next/image`), with `srcset` + `sizes`; vector stays SVG; animated GIFs become video; a full-resolution PNG hero is the most common single perf bug.
|
|
14
|
+
- Fonts self-hosted, subset, two weights not four.
|
|
15
|
+
- Less JavaScript: built-ins and small deps, route-level code splitting, nothing blocking first paint or interaction on analytics.
|
|
16
|
+
- A Core Web Vitals budget (LCP, CLS, INP) set at the start; Lighthouse for the lab number, field data for the truth.
|
|
17
|
+
|
|
18
|
+
Never do:
|
|
19
|
+
- `loading="lazy"` or `fetchpriority="low"` on the hero/LCP element (`wp-hero-not-lazy`).
|
|
20
|
+
- A `<script>` in `<head>` without `defer`.
|
|
21
|
+
</constraints>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: design-direction
|
|
3
|
+
description: Use when a feature, page or app gets a user-facing surface and no Design Direction exists yet for it, or when a restyle is asked for. Produces the plan (tokens, type roles, layout, signature element) that the code is then derived from.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# design-direction
|
|
7
|
+
|
|
8
|
+
One thing: write the `## Design Direction` section **before** any UI code, so the look is decided once and every colour and type choice in the build derives from it. Accessibility floors (`accessibility` rule) and the primitives module (`ui-primitives-one-module`) are the frame it works inside; `design-review` judges the rendered result against it.
|
|
9
|
+
|
|
10
|
+
<constraints>
|
|
11
|
+
Always do:
|
|
12
|
+
1. Ground it: name the one concrete subject, its audience and the page's single job. If the brief leaves it open, pick and state the choice.
|
|
13
|
+
2. Brainstorm a compact plan:
|
|
14
|
+
- **Colour**: 4 to 6 named tokens (surface, text, accent, per-domain colours), each with its dark-scheme pair. They go to `@theme`, nowhere else.
|
|
15
|
+
- **Type**: a characterful display face used with restraint, a complementary body face, a utility face for data if needed; a scale with intentional weights and spacing. Self-hosted.
|
|
16
|
+
- **Layout**: the concept in one sentence plus an ASCII wireframe; the page skeleton (container width, page header, section order, where the primary action sits).
|
|
17
|
+
- **Signature**: the single element this page will be remembered by. Spend the boldness there and keep everything around it quiet.
|
|
18
|
+
- **Risk**: one line on the risk taken.
|
|
19
|
+
3. Critique the plan before building: anything that reads like the generic default for this kind of prompt gets revised, with what changed and why. The three defaults to avoid: warm cream + high-contrast serif + terracotta; near-black + one acid accent; the purple-gradient SaaS page with Inter everywhere and a card for everything.
|
|
20
|
+
4. Review the plan against the brief before building: work through a similar prompt, and anything you would have arrived at anyway is a default, not a choice. `no-generated-look` lists them when the `ui-craft` pack is here. The brief's own words and a project's design system always win.
|
|
21
|
+
5. Write it into the feature doc as `## Design Direction`. The build derives from it; `design-review` checks against it.
|
|
22
|
+
6. Words are design material: controls say what happens ("Save changes", not "Submit"), the name survives the whole flow ("Publish" → "Published"), errors say what went wrong and how to fix it, empty states invite the first action. Sentence case, plain verbs, no filler.
|
|
23
|
+
|
|
24
|
+
Never do:
|
|
25
|
+
- Write UI code before the section exists.
|
|
26
|
+
- Scatter motion: one orchestrated moment beats many effects, and all of it respects `prefers-reduced-motion`.
|
|
27
|
+
- Let the direction override an accessibility floor; it works inside them.
|
|
28
|
+
</constraints>
|
|
29
|
+
|
|
30
|
+
Put the choice through a question only when the brief genuinely supports two directions; otherwise decide and show it.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: design-review
|
|
3
|
+
description: Use when a screen, component, mockup or stylesheet is ready for feedback, when a build reaches its verification phase with a browser surface, or when asked to critique layout, typography, colour, contrast or UX. Reviews rendered screenshots, never markup alone.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# design-review
|
|
7
|
+
|
|
8
|
+
One thing: judge the rendered UI, with cited findings, against the `## Design Direction` and the accessibility floors.
|
|
9
|
+
|
|
10
|
+
<constraints>
|
|
11
|
+
Always do:
|
|
12
|
+
- Review **screenshots of the running product**, both colour schemes, at phone width and desktop (Playwright, `deviceScaleFactor: 2`). Reading markup proves nothing about colour, contrast or layout; the colour may live in node_modules.
|
|
13
|
+
- Cite, never assert: a claim about user behaviour or a contrast failure points to a measurable standard (WCAG AA 4.5:1 body, 3:1 large) or a source; otherwise mark it as opinion.
|
|
14
|
+
- Accessibility is pass/fail: contrast; a visible focus state on every interactive element; `cursor: pointer` on every clickable thing and on nothing inert; icon-only buttons labelled; real `<label>`s; reduced motion respected; nothing by colour alone.
|
|
15
|
+
- Hierarchy: the most important thing is the most prominent; structure for the scan, not the close read; spacing groups what belongs together.
|
|
16
|
+
- Consistency: components and tokens reused before anything new; a one-off that duplicates a primitive is a finding; hardcoded colours or spacing are findings.
|
|
17
|
+
- Distinctive over default: name the templated patterns (purple gradient, Inter everywhere, a card for everything, centred everything) as findings, not taste notes; usability beats trend when a fashionable pattern costs the user.
|
|
18
|
+
- A surface with zero styling classes, or a list with no designed empty state, is an automatic **blocker**.
|
|
19
|
+
- Compare against `design/` reference images when they exist.
|
|
20
|
+
- Say which findings are law (a standard, a measured number) and which are taste: a taste finding must be defensible to a designer in one sentence.
|
|
21
|
+
- Judge the production build when there is one: minifiers and bundlers change what ships.
|
|
22
|
+
|
|
23
|
+
Never do:
|
|
24
|
+
- Pass a surface from the DOM or the diff.
|
|
25
|
+
- Soften a contrast or focus failure into a suggestion.
|
|
26
|
+
</constraints>
|
|
27
|
+
|
|
28
|
+
Output: findings grouped blocker / major / minor, each with the screenshot it was seen in, the standard or source, and the one change that fixes it; then the three things that are working and must not be lost in the fix.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pick-rendering-mode
|
|
3
|
+
description: Use when starting or scaffolding a site or app, adding a page kind that may render differently, or deciding whether a page is static, server-rendered, client-rendered or an island. Records the decision where the build can see it.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# pick-rendering-mode
|
|
7
|
+
|
|
8
|
+
One thing: decide the rendering mode per page kind up front and record it, instead of drifting into client-side rendering and hand-rolled multi-page HTML.
|
|
9
|
+
|
|
10
|
+
<constraints>
|
|
11
|
+
Always do:
|
|
12
|
+
- For anything where content, SEO or first paint matters, the content is in the **initial HTML response**: SSG (build time, CDN) for marketing, docs, blog, listing pages; SSR (per request) for personalised or auth-gated content; CSR or islands only for the genuinely interactive parts and for app surfaces behind a login where SEO is irrelevant. Mix per page.
|
|
13
|
+
- Several pages, a shared layout, routing or real data fetching → **Next.js** (the house framework), never hand-rolled vanilla JS and never a pure client-rendered SPA for a content site.
|
|
14
|
+
- A single landing page or a tiny embeddable widget → plain HTML and CSS; a framework there is its own mistake.
|
|
15
|
+
- Record the mode in the spec and in CLAUDE.md's load-bearing section: `Rendering: SSG for /, /docs/*; SSR for /account/*; islands for the editor`. A mode that is not written down was not decided.
|
|
16
|
+
- The client/server boundary follows from the mode (`client-boundaries` rule): data paths for every client-side navigation target are listed in the spec's API section.
|
|
17
|
+
|
|
18
|
+
Never do:
|
|
19
|
+
- Default to client rendering because it is the habit.
|
|
20
|
+
- Leave the mode implicit, or change it per page without updating the record.
|
|
21
|
+
</constraints>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: preflight-build
|
|
3
|
+
description: Use before any production build, deploy, image publish or release of a web app, and when asked whether the build is production-ready. Runs the real build and audits the emitted output; findings are blockers.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# preflight-build
|
|
7
|
+
|
|
8
|
+
One thing: prove the **actual** production build against the `production-build` rule. Configs can lie; the emitted output cannot.
|
|
9
|
+
|
|
10
|
+
<constraints>
|
|
11
|
+
Always do:
|
|
12
|
+
1. **Detect**: the bundler or framework CLI (next, webpack, rollup, esbuild, none), the real production build command from `scripts` (never invented), the output directory. Announce all three. No web build → say so and stop; do not pretend to have checked.
|
|
13
|
+
2. **Config audit**: the `prodbuild-*` lesson checks against every config file; Next: no `productionBrowserSourceMaps`, no disabled minification; webpack: `mode: 'production'`, `[contenthash]`, `output.clean`, `splitChunks { chunks: 'all' }`, CSS extracted (never `style-loader`), a `performance` budget, `devtool: 'source-map'` never `eval`. Build identity: a per-build version linked to a commit; its absence is advisory on the first preflight and a blocker once the project has ever deployed.
|
|
14
|
+
3. **Build for real**: run the command. A failing build is a hard stop; report the error verbatim.
|
|
15
|
+
4. **Output audit**: parse the entry HTML; count every request it triggers and list them; grep the emitted HTML/CSS/JS for third-party origins (a font host or runtime CDN is a blocker); every cacheable asset carries a content hash and the HTML references the hashed names; CSS is in files; total JS/CSS/image bytes (gzip) and the five largest assets against the budget; a full-resolution PNG hero is a blocker; run the bundle analyzer if it is already a dependency and report duplicates.
|
|
16
|
+
5. **Fix** what is fixable (self-host the font, vendor the CDN file, add the hash, compress the image), rebuild, re-audit.
|
|
17
|
+
6. **Gate**: blockers remaining → the deploy does not happen. Report: the three detected facts, the request count and origin list, the size table, each finding with its evidence and its fix.
|
|
18
|
+
|
|
19
|
+
Never do:
|
|
20
|
+
- Audit the source instead of `dist/`/`.next/`.
|
|
21
|
+
- Add a dependency just to get stats.
|
|
22
|
+
- Downgrade a blocker to a note because the deploy is wanted today.
|
|
23
|
+
</constraints>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: seo-audit
|
|
3
|
+
description: Use when asked to audit a URL or page for SEO, indexing, structured data, LLM citability, or why a page does not rank. Runs the 27 checks in checks.md against the live DOM and writes a severity-grouped report file.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# seo-audit
|
|
7
|
+
|
|
8
|
+
One thing: run the 27 technical SEO and LLM-readability checks in `checks.md` (beside this file) against the live page and write `seo-audit-<domain>-<date>.md`.
|
|
9
|
+
|
|
10
|
+
<constraints>
|
|
11
|
+
Always do:
|
|
12
|
+
1. Read `checks.md` first and run its JavaScript **verbatim** through the browser (Playwright, or the `playwright` MCP server if the project has it); never from memory. If `checks.md` is missing, say so up front and derive each check from its description, noting in the report that the canonical snippets were unavailable.
|
|
13
|
+
2. Navigate, wait for `document.readyState === 'complete'`, then run the categories in order: A identity and indexing (title, H1, heading hierarchy, meta, canonical, robots.txt fetched separately); B structured data (JSON-LD types, FAQ, chunk extractability: H2/H3 followed by a self-contained paragraph); C content semantics (alt audit, links, P vs SPAN census, landmarks, nav quality, article metadata); D accessibility and E-E-A-T as LLM signals (LLMs parse like screen readers); E performance and security (reload **before** console checks: timing, script and third-party counts, protocol, preloads, console errors including React hydration #418/#423); F cross-page internal linking.
|
|
14
|
+
3. Severity: P0 blocks indexing or throws errors; P1 major ranking, security or LLM impact; P2 clear degradation; P3 LLM/GEO gaps; P4 quick wins.
|
|
15
|
+
4. Report: title/URL/date; a 3 to 5 sentence summary naming the single most important fix; findings P0→P4 with the measured value; "What Google most likely ranks this page for" from the signals found; "Prerequisites before content work" when P0/P1 exist.
|
|
16
|
+
5. Save the file in the working directory and send it.
|
|
17
|
+
|
|
18
|
+
Never do:
|
|
19
|
+
- Guess a check's output.
|
|
20
|
+
- Skip the reload before capturing console errors.
|
|
21
|
+
- Report a finding without the measured value behind it.
|
|
22
|
+
</constraints>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "no-token-in-query",
|
|
3
|
+
"why": "A token in a URL lands in logs, history and proxies.",
|
|
4
|
+
"rule": ".claude/rules/identity-comes-from-the-connection.md",
|
|
5
|
+
"globs": [
|
|
6
|
+
"**/*.ts",
|
|
7
|
+
"**/*.js",
|
|
8
|
+
"**/*.mjs",
|
|
9
|
+
"**/*.cjs"
|
|
10
|
+
],
|
|
11
|
+
"exclude": [
|
|
12
|
+
"**/tests/**",
|
|
13
|
+
"**/test/**",
|
|
14
|
+
"**/*.test.*",
|
|
15
|
+
"**/*.spec.*",
|
|
16
|
+
"**/e2e/**",
|
|
17
|
+
"**/node_modules/**",
|
|
18
|
+
"**/dist/**",
|
|
19
|
+
"**/build/**",
|
|
20
|
+
"**/.next/**"
|
|
21
|
+
],
|
|
22
|
+
"pattern": "searchParams\\.get\\(\\s*['\"](?:token|api_?key|access_token|secret)['\"]",
|
|
23
|
+
"bad": "const token = url.searchParams.get('token');",
|
|
24
|
+
"good": "const token = await firstMessageToken(ws);",
|
|
25
|
+
"kind": "security"
|
|
26
|
+
}
|