@thedecipherist/claude-packs 0.0.0-stage → 1.1.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 +754 -0
- package/LICENSE +21 -0
- package/README.md +573 -2
- package/bin/claude-packs.mjs +212 -0
- package/configurations/base/config.json +85 -0
- package/configurations/cpp/config.json +93 -0
- package/configurations/full-stack/config.json +153 -0
- package/configurations/go/config.json +98 -0
- package/configurations/node/config.json +102 -0
- package/configurations/python/config.json +99 -0
- package/configurations/rust/config.json +106 -0
- package/configurations/synth-creator/config.json +148 -0
- package/global/hooks/gnu-shell.mjs +131 -0
- package/global/hooks/lib/shell-writes.mjs +2 -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/build-queue.mjs +22 -0
- package/lib/claude-md.mjs +60 -0
- package/lib/config-cli.mjs +36 -0
- package/lib/configs.mjs +145 -0
- package/lib/coverage.mjs +94 -0
- package/lib/custom-packs.mjs +93 -0
- package/lib/doctor.mjs +126 -0
- package/lib/fix-plan.mjs +72 -0
- package/lib/found-folders.mjs +25 -0
- package/lib/git-tokens.mjs +64 -0
- package/lib/global.mjs +125 -0
- package/lib/hook-proof.mjs +45 -0
- package/lib/hook-timing.mjs +42 -0
- package/lib/hover-gate.mjs +29 -0
- package/lib/kit-command.mjs +14 -0
- package/lib/kit-lock.mjs +149 -0
- package/lib/layout.mjs +99 -0
- package/lib/logs.mjs +109 -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 +109 -0
- package/lib/planner.mjs +59 -0
- package/lib/repeats.mjs +65 -0
- package/lib/repo-weight.mjs +28 -0
- package/lib/rule-tests.mjs +42 -0
- package/lib/rules.mjs +40 -0
- package/lib/scan-detect.mjs +130 -0
- package/lib/scan.mjs +171 -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 +31 -0
- package/lib/switches.mjs +44 -0
- package/lib/symmetry-doctor.mjs +26 -0
- package/lib/sync.mjs +133 -0
- package/lib/workorder.mjs +26 -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 +172 -0
- package/packs/audio-core/hooks/realtime-guard.mjs +67 -0
- package/packs/audio-core/pack.json +192 -0
- package/packs/audio-core/rules/a-control-is-proved-through-its-input.md +26 -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 +28 -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 +23 -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 +35 -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 +25 -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 +99 -0
- package/packs/base/hooks/dispatch-once.mjs +124 -0
- package/packs/base/hooks/file-size-guard.mjs +61 -0
- package/packs/base/hooks/folder-law.mjs +77 -0
- package/packs/base/hooks/git-guard.mjs +202 -0
- package/packs/base/hooks/lesson-checks.mjs +182 -0
- package/packs/base/hooks/lib/apply-edit.mjs +20 -0
- package/packs/base/hooks/lib/code-shapes.mjs +142 -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/crash-policy.mjs +47 -0
- package/packs/base/hooks/lib/dup-index.mjs +204 -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 +68 -0
- package/packs/base/hooks/lib/function-shapes.mjs +90 -0
- package/packs/base/hooks/lib/git-adds.mjs +21 -0
- package/packs/base/hooks/lib/git-auth.mjs +44 -0
- package/packs/base/hooks/lib/git-guard-selftest.mjs +192 -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 +69 -0
- package/packs/base/hooks/lib/layout.mjs +58 -0
- package/packs/base/hooks/lib/making-check-selftest.mjs +112 -0
- package/packs/base/hooks/lib/near-copies.mjs +76 -0
- package/packs/base/hooks/lib/program-read.mjs +199 -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/rust-scan.mjs +139 -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-lists.mjs +31 -0
- package/packs/base/hooks/lib/shape-prose.mjs +78 -0
- package/packs/base/hooks/lib/shape.mjs +273 -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 +86 -0
- package/packs/base/hooks/lib/unread-writes.mjs +24 -0
- package/packs/base/hooks/lib/writes.mjs +71 -0
- package/packs/base/hooks/making-check.mjs +248 -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 +140 -0
- package/packs/base/hooks/secrets-guard.mjs +99 -0
- package/packs/base/hooks/shape-law.mjs +140 -0
- package/packs/base/hooks/suite-once.mjs +96 -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 +19 -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 +23 -0
- package/packs/base/rules/unattended-runs.md +15 -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/new-project/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/skills/write-a-workorder/SKILL.md +41 -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 +26 -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 +29 -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/postgres/checks/pg-bind-values.json +33 -0
- package/packs/postgres/checks/pg-concurrently-in-txn.json +18 -0
- package/packs/postgres/checks/pg-fk-not-valid.json +18 -0
- package/packs/postgres/checks/pg-index-concurrently.json +18 -0
- package/packs/postgres/checks/pg-no-float-money.json +19 -0
- package/packs/postgres/checks/pg-no-money.json +18 -0
- package/packs/postgres/checks/pg-no-required-column.json +18 -0
- package/packs/postgres/checks/pg-no-volatile-default.json +18 -0
- package/packs/postgres/checks/pg-not-exists.json +18 -0
- package/packs/postgres/checks/pg-timestamptz.json +18 -0
- package/packs/postgres/hooks/db-wipe-guard.mjs +95 -0
- package/packs/postgres/pack.json +48 -0
- package/packs/postgres/rules/postgres-migrations-never-stop-traffic.md +28 -0
- package/packs/postgres/rules/postgres-one-pool-per-process.md +21 -0
- package/packs/postgres/rules/postgres-queries-are-null-safe-and-bounded.md +26 -0
- package/packs/postgres/rules/postgres-types-say-what-they-hold.md +22 -0
- package/packs/postgres/rules/postgres-values-are-bound.md +130 -0
- package/packs/postgres/skills/postgres-safe-migration/SKILL.md +45 -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 +22 -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 +22 -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/rust/checks/rust-allow-needs-reason.json +16 -0
- package/packs/rust/checks/rust-blocking-in-async.json +32 -0
- package/packs/rust/checks/rust-if-chain-is-a-match.json +32 -0
- package/packs/rust/checks/rust-static-mut.json +32 -0
- package/packs/rust/checks/rust-string-as-error.json +34 -0
- package/packs/rust/checks/rust-stub-left-in.json +32 -0
- package/packs/rust/checks/rust-unsafe-needs-safety.json +31 -0
- package/packs/rust/checks/rust-unwrap-in-library.json +34 -0
- package/packs/rust/checks/rust-wildcard-dependency.json +16 -0
- package/packs/rust/clippy.toml +5 -0
- package/packs/rust/pack.json +27 -0
- package/packs/rust/rules/rust-async-never-blocks.md +20 -0
- package/packs/rust/rules/rust-borrow-before-you-clone.md +19 -0
- package/packs/rust/rules/rust-errors-are-returned.md +22 -0
- package/packs/rust/rules/rust-lints-are-the-gate.md +23 -0
- package/packs/rust/rules/rust-repeats-become-templates.md +28 -0
- package/packs/rust/rules/rust-unsafe-is-proved.md +21 -0
- package/packs/rust/skills/rust-extract-template/SKILL.md +50 -0
- package/packs/rust/skills/rust-port/SKILL.md +22 -0
- package/packs/rust/skills/rust-review/SKILL.md +24 -0
- package/packs/rust/tools/rust-lints.toml +19 -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/bounce-a-plugin/SKILL.md +40 -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/sound-design/tools/vst3host/build.sh +73 -0
- package/packs/sound-design/tools/vst3host/host_events.h +101 -0
- package/packs/sound-design/tools/vst3host/options.h +172 -0
- package/packs/sound-design/tools/vst3host/render.cpp +245 -0
- package/packs/sound-design/tools/vst3host/session.h +241 -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 +175 -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 +21 -0
- package/packs/synth-creator/tools/buildq.mjs +74 -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
- package/prompts/workorder/PROMPT.md +53 -0
- package/prompts/workorder/run.sh +36 -0
- package/prompts/workorder/workorder.md +59 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
# concepts: ui-markup, ui-styles
|
|
3
|
+
paths:
|
|
4
|
+
- "placeholder"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Motion is rare, interruptible and optional
|
|
8
|
+
|
|
9
|
+
<constraints>
|
|
10
|
+
Always do:
|
|
11
|
+
- Honour `prefers-reduced-motion`: a reduced variant, or none.
|
|
12
|
+
- Animate `transform` and `opacity` only, and list the properties in a transition.
|
|
13
|
+
- Let input interrupt any animation.
|
|
14
|
+
- Spend motion on one moment: a single page-load sequence or one reveal lands better than an effect on every section. Decelerate smoothly.
|
|
15
|
+
- Give anything that moves on its own for over 5 seconds a pause, stop or hide control.
|
|
16
|
+
- Ask first: how often is it seen (hundreds of times: no animation), and what is it for? "It looks nice" is valid only for one signature moment.
|
|
17
|
+
- Use ease-out for what enters or leaves, ease-in-out between two places, linear for scroll-linked motion. Never ease-in: the first frames barely move.
|
|
18
|
+
- Time it: press 100-160ms, hover 150-200ms, menus 150-250ms, dialogs 250-450ms, reveals 500-900ms. Leaving takes about 70% of arriving.
|
|
19
|
+
- Reduce motion to fewer and gentler, not none: keep opacity and colour, drop travel, scale, parallax and autoplay.
|
|
20
|
+
- Paint the headline, the sentence and the picture on the first frame. Vary entrances with the content, in reading order, and fire them once.
|
|
21
|
+
- Pause loops when off screen or when the tab is hidden.
|
|
22
|
+
|
|
23
|
+
Never do:
|
|
24
|
+
- `transition: all` (`ui-no-transition-all`).
|
|
25
|
+
- Bounce or elastic easing (`ui-no-bounce-easing`).
|
|
26
|
+
- Fade-and-slide every section in, loop a marquee, or pulse a status dot for decoration.
|
|
27
|
+
- Hide content until an animation reveals it: the text must be there at rest.
|
|
28
|
+
- Animate layout properties (`ui-no-animate-layout`): width, height, top, left, margin and padding force layout on every frame.
|
|
29
|
+
- Capture the wheel or lock scrolling (`ui-no-scroll-hijack`). No preloader, no counter, no gate.
|
|
30
|
+
- Move anything across text being read.
|
|
31
|
+
</constraints>
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
# concepts: ui-markup, ui-styles
|
|
3
|
+
paths:
|
|
4
|
+
- "placeholder"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# No generated look: every default is a choice or it goes
|
|
8
|
+
|
|
9
|
+
Generated UI clusters around the same traits. Each is fine when a brief asks for it; the fault is reaching for it without choosing. The brief's own words and a project's design system always win.
|
|
10
|
+
|
|
11
|
+
<constraints>
|
|
12
|
+
Never do, unless the brief or the design system asks:
|
|
13
|
+
- Purple or violet gradients, or cyan on dark (`ui-no-ai-palette`).
|
|
14
|
+
- A warm cream ground with a serif display and a terracotta accent; near-black with one acid accent.
|
|
15
|
+
- Gradient text (`ui-no-gradient-text`), or one accented word in a headline.
|
|
16
|
+
- A tiny uppercase tracked label above a heading (`ui-no-eyebrow`), or a pill badge above the headline.
|
|
17
|
+
- Index numbers beside headings: 01, 02, 03 (`ui-no-index-numbering`).
|
|
18
|
+
- A thick coloured border down one side of a card (`ui-no-side-tab`).
|
|
19
|
+
- Cards inside cards, rows of identical cards, an icon in a rounded tile above every heading.
|
|
20
|
+
- The same soft shadow under everything, coloured glows, one border radius regardless of hierarchy.
|
|
21
|
+
- Glass panels, floating pill navigation, decorative blobs, grid-line backgrounds.
|
|
22
|
+
- Fake dashboards of grey bars, a placeholder where a picture should be: no image is better.
|
|
23
|
+
- The overused faces by reflex: Inter, Roboto, Fraunces, Geist, Plus Jakarta Sans, Space Grotesk.
|
|
24
|
+
- The assistant palette: a yellow-cream ground with terracotta or clay (`ui-no-assistant-palette`). It was the published fix for the earlier tells, and became the most recognisable look of all.
|
|
25
|
+
- Emoji as icons or bullets (`ui-no-emoji-as-ui`).
|
|
26
|
+
- Micro-UI clutter: fake status pills, pseudo-system labels ("00 orchestration layer"), decorative code-like tags, filler metadata rows.
|
|
27
|
+
- Box inside box inside box: one framing move, then alignment and space.
|
|
28
|
+
|
|
29
|
+
Always do:
|
|
30
|
+
- Spend your boldness in one place. Let one element be memorable and keep the rest quiet.
|
|
31
|
+
- Fill the space ornament leaves with scale, full content or a real picture, not another ornament.
|
|
32
|
+
- Use structure that carries information: an outline, a number or a divider earns its place by saying something.
|
|
33
|
+
- Replace a tell with a procedure, never a product: derive it from the subject. Every published "use this instead" list becomes the next wave of tells.
|
|
34
|
+
- Put an idea in first. A page with every tell removed and nothing in their place is an empty page with good manners, and that is a tell too.
|
|
35
|
+
|
|
36
|
+
On the taste-skill study of 247 sites: those scored 7.5 or higher used icon feature cards 1% of the time against 28% for sites under 6.5, pill badges 14% against 34%, gradients 22% against 52%, shadows 24% against 48%, tiny tracked caps 16% against 57%.
|
|
37
|
+
</constraints>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
# concepts: ui-markup
|
|
3
|
+
paths:
|
|
4
|
+
- "placeholder"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# A page holds its frame: a title, equal margins, no accidental holes
|
|
8
|
+
|
|
9
|
+
For pages people read once: landing, marketing, portfolio, product.
|
|
10
|
+
|
|
11
|
+
<constraints>
|
|
12
|
+
Always do:
|
|
13
|
+
- Say on the first screen what this is, in a real `h1`, and give every section a heading.
|
|
14
|
+
- Keep one pair of equal outer margins. Readers name unequal margins first, before any detail.
|
|
15
|
+
- Answer a void: every empty area is closed by something on its far side, or it is a deliberate rest, once per page.
|
|
16
|
+
- Keep the gap between sections clearly larger than any gap inside one.
|
|
17
|
+
- Give neighbouring sections different compositions. A repeated module is for archives only: a menu, a schedule, a work index.
|
|
18
|
+
- Carry the idea to the last section, pricing and FAQ included: most pages turn into stock blocks after the hero.
|
|
19
|
+
- Make the phone a composition of its own, with its own crop and line breaks.
|
|
20
|
+
- Keep to the order of the argument, not the stock order of hero, logos, features, testimonial, pricing, CTA.
|
|
21
|
+
|
|
22
|
+
Never do:
|
|
23
|
+
- Pad a short page: a quarter of the studied sites are one or two screens.
|
|
24
|
+
- Stretch thin content over many screens. In blind tests a richer page full of template devices beat a cleaner page that was thin, every time.
|
|
25
|
+
- Put a gate, a preloader or an entry pop-up before the content.
|
|
26
|
+
- Let anything cover a headline at any scroll position.
|
|
27
|
+
- Set a statement over three lines at headline size: it reads as a long headline.
|
|
28
|
+
</constraints>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
# concepts: ui-markup
|
|
3
|
+
paths:
|
|
4
|
+
- "placeholder"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# A page is proved rendered, not read
|
|
8
|
+
|
|
9
|
+
Reading markup proves nothing about contrast, overflow or layout. A grep passes cleanly in exactly the failing case.
|
|
10
|
+
|
|
11
|
+
<constraints>
|
|
12
|
+
Always do:
|
|
13
|
+
- Name the gate that proves it in `.claude/layout.json`: `"gates": { "a11y": "<command>" }`, or `"none: <reason>"` to decline. `doctor` is red for UI code without one. The `prove-page` skill builds it.
|
|
14
|
+
- Run it on what the visitor receives: the production build, not only the dev server.
|
|
15
|
+
- Treat it as a floor: automated checks catch only part of accessibility, so keyboard and screen-reader passes stay by hand.
|
|
16
|
+
|
|
17
|
+
Never do:
|
|
18
|
+
- Call a page done from its source.
|
|
19
|
+
</constraints>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
# concepts: ui-markup
|
|
3
|
+
paths:
|
|
4
|
+
- "placeholder"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Pictures: real things first, one strong image over six small ones
|
|
8
|
+
|
|
9
|
+
The top-scored sites in taste-skill's study show, and the weak ones tell: a median of 37 images against 5.
|
|
10
|
+
|
|
11
|
+
<constraints>
|
|
12
|
+
Always do:
|
|
13
|
+
- Choose in order: the project's own images; ones generated this session; real pictures from open collections, with credit; drawings of the subject itself; type and colour alone, on purpose.
|
|
14
|
+
- Let one dominant image lead: on the top sites hero media covers at least half the first screen 68% of the time.
|
|
15
|
+
- Give every image a job: show the thing, set the place, prove the claim.
|
|
16
|
+
- Keep crops to one or two ratios and one treatment, and share one light and grade.
|
|
17
|
+
- Put a flat scrim or a calm area under any text on a picture. Text lost over a busy image is a named failure.
|
|
18
|
+
- Use a real interface fragment to show software, marked up as the product's own.
|
|
19
|
+
- Download found pictures into the project, credit them, and list them for the owner.
|
|
20
|
+
|
|
21
|
+
Never do:
|
|
22
|
+
- Ship a placeholder or a grey box: no image is better (`ui-no-empty-image`).
|
|
23
|
+
- Present a found picture as the client's own product, room or team.
|
|
24
|
+
- Use an unrelated stock photograph where a drawing of the real subject would do.
|
|
25
|
+
</constraints>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
# concepts: ui-markup, ui-styles
|
|
3
|
+
paths:
|
|
4
|
+
- "placeholder"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Everything the pointer can act on says so
|
|
8
|
+
|
|
9
|
+
a hovered element MUST show it is interactable by changing the cursor to match the action, and should usually do something that fits it.
|
|
10
|
+
|
|
11
|
+
<constraints>
|
|
12
|
+
Always do:
|
|
13
|
+
- Change the cursor to name the action: `pointer` to activate, `text` to edit, `grab` and `grabbing` to drag, `col-resize` or `row-resize` to resize, `zoom-in` to enlarge, `not-allowed` for what is truly disabled.
|
|
14
|
+
- Give the hovered thing itself a small effect that fits it: a tone step, a colour, a slight growth, an underline. Hover colour in 180-200ms, a hover that moves in 300-400ms.
|
|
15
|
+
- Press answers too: a small change in 100-160ms, so a click is felt.
|
|
16
|
+
- Use one hit test for hover and press: one function or element, never a second list.
|
|
17
|
+
- Keep the disabled look for what is truly disabled. Something that responds gets the hover.
|
|
18
|
+
- Give a new screen its hover in the same change that makes it interactive.
|
|
19
|
+
- Make hover and focus-visible agree, so a keyboard user sees what a mouse user sees.
|
|
20
|
+
- Prove it: name the hover gate in `.claude/layout.json`, `"gates": { "hover": "<command>" }`, or `"none: <reason>"` to decline. `doctor` is red for UI code without one. The `hover-state` skill says how.
|
|
21
|
+
- Build the hover into the template, so every instance has it and it is changed and tested once (`test-the-template-once`).
|
|
22
|
+
|
|
23
|
+
Never do:
|
|
24
|
+
- A `pointer` cursor on something inert, or no change on something that acts.
|
|
25
|
+
- A custom cursor image (`ui-no-custom-cursor`).
|
|
26
|
+
- Let the effect shift the layout or the neighbours: transform, shadow or colour, never size or margin.
|
|
27
|
+
- Lift or zoom every card: the effect means "this acts", so an element that does nothing gets none.
|
|
28
|
+
</constraints>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
# concepts: ui-markup
|
|
3
|
+
paths:
|
|
4
|
+
- "placeholder"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# A screen answers one question, and the biggest thing on it is the answer
|
|
8
|
+
|
|
9
|
+
For application screens: dashboards, admin, settings, inboxes. The `app-screen` skill is the method. The numbers are from taste-skill's study of 23 product screens.
|
|
10
|
+
|
|
11
|
+
<constraints>
|
|
12
|
+
Always do:
|
|
13
|
+
- Write the screen's one question in a line ("Which deploy broke?", "Who is waiting for a reply?"). It decides what is biggest, what comes first, and what is left out.
|
|
14
|
+
- Name the one finding in today's data ("the 23:28 deploy doubled the error rate") and put it where it is read first, next to the action it drives.
|
|
15
|
+
- List the blocks as answers to the next questions. A block with no question is deleted: this is how to escape KPI row, big chart, two small charts, table.
|
|
16
|
+
- Put the most frequent job one click away, where the answer shows. A screen with no control for its main job is a report, not a tool.
|
|
17
|
+
- Show the evidence beside the answer: one annotated line on the event that matters beats a second chart.
|
|
18
|
+
- Show everything the brief names on the first screen; cap long lists at 4-6 rows with "View all".
|
|
19
|
+
- Size each block to its question, not to the data the product hopes for. A new account's small numbers are drawn at their real size.
|
|
20
|
+
|
|
21
|
+
Never do:
|
|
22
|
+
- Let a secondary figure out-shout the answer: the largest number answers the title's sentence.
|
|
23
|
+
- Copy a well-known product's arrangement: take the structure from this product's own things.
|
|
24
|
+
</constraints>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
# concepts: ui-markup, ui-styles
|
|
3
|
+
paths:
|
|
4
|
+
- "placeholder"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Every screen survives real data: long, empty, loading and failed
|
|
8
|
+
|
|
9
|
+
<constraints>
|
|
10
|
+
Always do:
|
|
11
|
+
- Design for short, average and very long input. Text containers truncate, clamp or wrap; a flex child that holds text gets `min-width: 0`.
|
|
12
|
+
- Give every list an empty state that says what goes here and offers the action that fills it.
|
|
13
|
+
- Show loading in the place the content will appear, and end the words with "..." or the ellipsis the design system uses.
|
|
14
|
+
- Say what failed and what to do next, where the person is looking: inside the block that failed, with when the data was last good and a Retry. Never a full-screen banner.
|
|
15
|
+
- Keep an empty section's frame and header, with one sentence spanning it. On a first run, put the first action where the data will appear.
|
|
16
|
+
- Load with the final layout: each value a flat bar at its real size, labels shown at once, nothing shifting when the data lands. A refresh keeps the old values and updates a freshness stamp.
|
|
17
|
+
- Show limits as a bar at the true ratio with both ends labelled ("12.7k of 20.0k").
|
|
18
|
+
- Reserve space for what arrives late, so nothing jumps.
|
|
19
|
+
|
|
20
|
+
Never do:
|
|
21
|
+
- Render a broken screen for an empty string or an empty array.
|
|
22
|
+
- Show a spinner with no end: a slow request says so, and offers a way out.
|
|
23
|
+
</constraints>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
# concepts: ui-markup, ui-styles
|
|
3
|
+
paths:
|
|
4
|
+
- "placeholder"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Touch, zoom and small screens are not an afterthought
|
|
8
|
+
|
|
9
|
+
<constraints>
|
|
10
|
+
Always do:
|
|
11
|
+
- Make touch targets at least 24 by 24 CSS pixels (WCAG 2.2), and about 44 for a primary action.
|
|
12
|
+
- Give drag, swipe and pinch a tap and a keyboard alternative.
|
|
13
|
+
- Use `env(safe-area-inset-*)` on full-bleed layouts, `overscroll-behavior: contain` in modals and drawers, and `touch-action: manipulation` on controls.
|
|
14
|
+
- Set `color-scheme` and a matching `theme-color`, so scrollbars and inputs follow a dark theme.
|
|
15
|
+
|
|
16
|
+
Never do:
|
|
17
|
+
- Disable zoom (`ui-no-zoom-lock`).
|
|
18
|
+
- `autoFocus` on a phone: it opens the keyboard over the page.
|
|
19
|
+
</constraints>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
# concepts: ui-markup, ui-styles
|
|
3
|
+
paths:
|
|
4
|
+
- "placeholder"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Type, space and colour: a few strong choices, measured
|
|
8
|
+
|
|
9
|
+
Numbers from taste-skill's study of 247 gallery sites, unless marked.
|
|
10
|
+
|
|
11
|
+
<constraints>
|
|
12
|
+
Always do:
|
|
13
|
+
- Type: two or three sizes do the work, five is the ceiling. One family is normal, two the limit. Body text 16-20px, line height 1.45-1.6, 45-75 characters per line. A real scale: a headline-to-body ratio around 4.3 on the studied sites.
|
|
14
|
+
- Space: one grid and one pair of margins, equal on both sides. The gap between sections is clearly larger than any gap inside one, and spacing has rhythm: tight inside a group, loose between groups.
|
|
15
|
+
- Headings: one `h1`, no skipped levels, more space above a heading than below it.
|
|
16
|
+
- Colour: one ground, one ink, one accent, the accent on the action and perhaps one other thing. Running text in the full ink. Separate surfaces by a small step in tone.
|
|
17
|
+
- Align left by default; centre at most one moment.
|
|
18
|
+
- Align everything horizontally and vertically. What looks grouped is a group: the same size, the same spacing, shared edges. Repeated things are one size.
|
|
19
|
+
- Name colours as tokens by role: ground, surface, ink, muted, accent, accent ink. A raw hex in a component is a second palette starting.
|
|
20
|
+
- Headlines: size contrast is the lever, not weight. Half of the studied heroes are regular weight.
|
|
21
|
+
- Stay above the floors: text at 12px or more, contrast 4.5:1 for body and 3:1 for large text (WCAG).
|
|
22
|
+
|
|
23
|
+
Never do:
|
|
24
|
+
- Justify narrow columns, or set long passages in capitals.
|
|
25
|
+
- Put grey text on a coloured background: use a darker shade of that colour.
|
|
26
|
+
</constraints>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
# concepts: ui-markup
|
|
3
|
+
paths:
|
|
4
|
+
- "placeholder"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# The URL holds the state, and a destructive action can be taken back
|
|
8
|
+
|
|
9
|
+
<constraints>
|
|
10
|
+
Always do:
|
|
11
|
+
- Keep filters, tabs, pagination and open panels in the URL, so a view can be shared, reloaded and reached with Back.
|
|
12
|
+
- Use real links for navigation, so Cmd-click and middle-click work.
|
|
13
|
+
- Give a destructive action a confirmation that names what dies, or an undo window.
|
|
14
|
+
- Send focus somewhere sensible on a route change, and keep a sticky header from covering what has focus.
|
|
15
|
+
|
|
16
|
+
Never do:
|
|
17
|
+
- Navigate from `onClick` on something that is not a link.
|
|
18
|
+
- Delete on one click with no way back.
|
|
19
|
+
</constraints>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: app-screen
|
|
3
|
+
description: Use when building or changing an application screen, a dashboard, an admin or analytics view, settings, an inbox or a list screen.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Build an app screen from its data (one job: a screen that answers its question)
|
|
7
|
+
|
|
8
|
+
A page is read once; a screen is read every day. `apps-are-not-pages` says what changes.
|
|
9
|
+
|
|
10
|
+
<constraints>
|
|
11
|
+
Always do:
|
|
12
|
+
1. Inventory, in 8 to 12 lines: the objects and fields with units; real magnitudes, including how small they are for a new account; who opens this, how often, on what device; what they do next, and which job comes up most; the product's own things (its name, the people, what people recognise by sight).
|
|
13
|
+
2. Write the data first: a small dataset the screen renders from, with believable names, amounts that add up and a unit on every figure. Totals are computed from the rows. Assert in the data file what must agree, and read the console.
|
|
14
|
+
3. Write the screen's one question and one finding (`screen-answers-one-question`), then list the blocks as answers to the next questions.
|
|
15
|
+
4. Pick the shell: a sidebar on the page's own ground, or a top bar only if it carries something. One left edge and one right edge for every block.
|
|
16
|
+
5. Set the KPIs: default to one container split by 1px dividers; values 16-40px, about 1.7 times the label; label above the value, grey, sentence case. Nothing else in the tile. The answer figure is 30-36px and at least 1.3 times its siblings. A figure appears in one place only.
|
|
17
|
+
6. Set tables: rows 36-53px, 56-92px with media; 12px grey sentence-case headers, no band; numbers right-aligned with their header; one status mark; a sort glyph on the active column only. Overview lists show 2-5 rows.
|
|
18
|
+
7. Forms: label above the field, 14px; no floating labels; one control height per context. Disabled controls stay legible and say why. Beside a setting, show what it produces.
|
|
19
|
+
8. Build every block's empty, zero, loading and error state, and every row's hover, selected, focus and disabled state. A screen that works only with full data is half built.
|
|
20
|
+
9. Check the rendered screen at 1440, 768 and 390 (`prove-page`), and answer in writing:
|
|
21
|
+
- Is the question answered by the biggest thing, and read first?
|
|
22
|
+
- Do all blocks share the screen's edges, with no dead strip or stretched card?
|
|
23
|
+
- Is colour only on data, status and the one action?
|
|
24
|
+
- Do the numbers add up and line up, and does every fact shown twice agree?
|
|
25
|
+
- Does every zero look like a zero, and every missing value like a dash?
|
|
26
|
+
- Does each legend match its mark, with no label colliding?
|
|
27
|
+
- On the phone, is the navigation folded, and does each block still answer?
|
|
28
|
+
10. Fix the worst three, look again, three rounds at most. If a problem shows in a screenshot it is real, whatever the code says.
|
|
29
|
+
|
|
30
|
+
Never do:
|
|
31
|
+
- Shrink the type and keep the padding: density is row pitch, padding and type moved together.
|
|
32
|
+
- Mix save models on one view.
|
|
33
|
+
</constraints>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: build-from-reference
|
|
3
|
+
description: Use when a screenshot, mockup or design image is the source for a page or component, or when asked to match or copy a look.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Build from a reference image (one job: the code looks like the picture)
|
|
7
|
+
|
|
8
|
+
The common failure is drift: a strong reference, and a coded result that became generic.
|
|
9
|
+
|
|
10
|
+
<constraints>
|
|
11
|
+
Always do:
|
|
12
|
+
1. Read it like a specification before writing code. Extract:
|
|
13
|
+
- **Text:** every readable word: headline, supporting line, button labels, navigation, section headings.
|
|
14
|
+
- **Type:** character, the scale between sizes, line counts, where lines wrap, alignment.
|
|
15
|
+
- **Space:** section gaps, padding, gutters, the grid, card proportions.
|
|
16
|
+
- **Components:** button shapes and hierarchy, border radius, strokes, icons, shadows.
|
|
17
|
+
- **Colour:** the palette, the accent, background and image treatment.
|
|
18
|
+
- **Structure:** section order, density, repeated motifs.
|
|
19
|
+
2. Say why it looks strong, in a few lines, and list what is unclear.
|
|
20
|
+
3. Build to it section by section, comparing a screenshot with the reference at the same width. A photograph is evidence of the design: draw the object straight on and aligned, never its camera angle or its wear.
|
|
21
|
+
4. Resolve what is unclear in this order: the visible design language, the layout and spacing logic, the component family, the polish level, then the most faithful option that can be built.
|
|
22
|
+
5. Report every place the code differs from the reference, and why.
|
|
23
|
+
|
|
24
|
+
Never do:
|
|
25
|
+
- Improve it into a default layout, or swap a distinctive section for a generic row.
|
|
26
|
+
- Compress generous spacing, or merge sections into a repeated pattern the reference does not have.
|
|
27
|
+
- Fill an unclear detail with a default before going through step 4.
|
|
28
|
+
</constraints>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: chart-choice
|
|
3
|
+
description: Use when a screen needs a chart or a figure, or a chart looks wrong, cluttered or unclear.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Pick the chart from the question (one job: the plainest form that answers it)
|
|
7
|
+
|
|
8
|
+
| Question | Form |
|
|
9
|
+
|---|---|
|
|
10
|
+
| Is it moving over time? | One 2px line, straight, no markers; an area only with a fill of 15% or less |
|
|
11
|
+
| How much per period? | Columns with square corners |
|
|
12
|
+
| How is it distributed? | A histogram with equal bins |
|
|
13
|
+
| Who ranks? | A sorted horizontal bar list |
|
|
14
|
+
| What share? | A thin ring, or a 100% stacked bar; five parts at most, legend as a table |
|
|
15
|
+
| How far to the target? | A progress bar, both ends labelled, the fill the true ratio |
|
|
16
|
+
| Has it drifted from target? | One row per part: a bar with a 1px tick at the target |
|
|
17
|
+
| Where? | A map with a list beside it; the list carries the magnitudes |
|
|
18
|
+
| Which way did it flow? | Columns above and below one zero line, the axis signed and captioned |
|
|
19
|
+
|
|
20
|
+
<constraints>
|
|
21
|
+
Always do:
|
|
22
|
+
- Ask whether it needs a chart: four of the 23 studied screens draw none, because a few numbers say it.
|
|
23
|
+
- Show one series per chart, three at most; switch metrics with a control, not by overlaying lines.
|
|
24
|
+
- Use 3-5 faint gridlines, no y-axis line, round ticks above the maximum, no legend for a single series.
|
|
25
|
+
- Draw a plot about 112-264px tall. A series flat except for one event gets two-thirds of the width, with the event annotated.
|
|
26
|
+
- Dash a forecast after today, and label its end value.
|
|
27
|
+
- Encode it in the chart if a caption has to say which bars are which.
|
|
28
|
+
- Draw an empty chart: the zero line, missing bars for empty periods, one sentence.
|
|
29
|
+
|
|
30
|
+
Never do:
|
|
31
|
+
- Use a hue per bar, or more than four hues on a screen.
|
|
32
|
+
- Smooth a line with a spline, or put a dot on every point.
|
|
33
|
+
- Use a fat donut with labels on the slices.
|
|
34
|
+
</constraints>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: hover-state
|
|
3
|
+
description: Use when a button, link, tab, row, card or any clickable element is added or changed in the web app, when something does not react under the mouse, or when a hover gate is written or fails.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Hover state (one job: every clickable thing answers the pointer, and a gate proves it)
|
|
7
|
+
|
|
8
|
+
The law is the rule `web-hover-every-pressable`: a cursor naming the interaction, and a small visible effect on the hovered element itself.
|
|
9
|
+
|
|
10
|
+
## Add the hover to a new element
|
|
11
|
+
1. Use a real `button` or `a` (or give a custom element a role and both of the next two).
|
|
12
|
+
2. Set `cursor` from the interaction: `pointer` for a press or link, `text` for a field, `grab` or a resize cursor for a drag, `not-allowed` only when truly disabled.
|
|
13
|
+
3. Add a `:hover` (and `:focus-visible`) style on that element: a lift, a ring, a brighten, an underline; a transition of about 100 ms. Change transform, shadow or colour, never size or margin, so the neighbours stay still.
|
|
14
|
+
4. Define it once on the shared component, so every use gets it; do not restyle per page.
|
|
15
|
+
|
|
16
|
+
## Prove it: the hover walk
|
|
17
|
+
A browser test (Playwright, in the project's own test folder) that, for one element of each component and every one-off on each screen (`button, a[href], [role=button], [role=tab], input, select, textarea, [tabindex]`):
|
|
18
|
+
1. moves the pointer to its centre;
|
|
19
|
+
2. reads `getComputedStyle(el).cursor` and requires the interaction's cursor, never `auto` or `default`;
|
|
20
|
+
3. screenshots the element's box and a ring round it before and after: the box changes by a floor, the ring does not;
|
|
21
|
+
4. moves away and requires the box back to rest.
|
|
22
|
+
Plant the faults so it is seen red: remove the hover style from one component, remove its cursor, leave one clickable `div` bare.
|
|
23
|
+
|
|
24
|
+
## Declare it
|
|
25
|
+
`layout.json`: `"gates": { "hover": "<the command>" }` (for example `npm run test:hover`). `doctor` is red while the web app has code and no gate is declared, or the command names a file that is not there. `"hover": "none: <reason>"` declines with its reason.
|
|
26
|
+
|
|
27
|
+
## Worked example
|
|
28
|
+
Stellix (a drawn window, not a page): `tools/gates/hover_gate.sh`, `lib/app/gates/editor_hoverwalk_read.h`, `tools/gates/hover_judge.py`. The same five steps, with the page's pointer in place of the window's.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: page-critique
|
|
3
|
+
description: Use when judging a rendered page, when a page feels generic or flat, or when design-review needs a deeper pass on a marketing or landing page.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Critique a rendered page (one job: find what a stranger would notice, and fix in the right order)
|
|
7
|
+
|
|
8
|
+
Make each pass on its own, on the screenshots at desktop and phone. App screens use the checks in `app-screen`.
|
|
9
|
+
|
|
10
|
+
<constraints>
|
|
11
|
+
Always do:
|
|
12
|
+
1. **One second, then five.** Glance away: there should be one answer, a word, an image, an object. "A website" means no focal point. Then five seconds as a stranger: what is this, who is it for, what do I do?
|
|
13
|
+
2. **Squint.** The page reduces to two or three large masses. Many similar masses means nothing leads.
|
|
14
|
+
3. **Cover the logo.** Could this belong to a competitor? Swap the name and the noun: an equally valid page has no idea. Does the idea reach the pricing, the FAQ and the footer?
|
|
15
|
+
4. **Edges.** Count the distinct left edges of text blocks. Two or three reused on purpose; six means things were placed one at a time.
|
|
16
|
+
5. **Space and frame.** Equal outer margins? Any section huddled on one side? A hole, or a rest? Any blank stretch over half a screen?
|
|
17
|
+
6. **Type.** Is the jump from body to headline decisive, three times or more? More than five sizes? Orphan words? Lines over 75 characters?
|
|
18
|
+
7. **Colour.** Name the proportions. An accent in ten places means nothing.
|
|
19
|
+
8. **Images.** Is every image doing a job? Do crops share ratios? Any grey box or fake screen?
|
|
20
|
+
9. **Sameness.** One word per section's layout. The same word twice in a row, or three times on the page, is the template showing.
|
|
21
|
+
10. **Phone.** A composition of its own, or the desktop squeezed?
|
|
22
|
+
11. **Fullness.** Is each screen composed, or a narrow column with dead ground? An austere page is not a restrained one.
|
|
23
|
+
12. **Substance.** Does every section deliver its information at a readable size? Is the primary action a real button on the first screen?
|
|
24
|
+
13. **Collisions.** Anything on a headline or a button at any scroll position? Anything off the edge of the phone?
|
|
25
|
+
14. **The competitor.** Put the nearest competitor's name on it. Then name the one live thing the visitor can do.
|
|
26
|
+
15. **Cap the score.** Any placeholder caps content at 5. A blank band where a reveal failed caps usability at 5. No clear title, or anything covering a headline, caps usability at 6. An idea that fits anyone caps creativity at 6. Unequal margins or a huddled section cap design at 6.5.
|
|
27
|
+
16. **Fix in this order:** the idea, hierarchy, composition, typography, imagery, colour, detail, motion. Later items cannot rescue earlier ones.
|
|
28
|
+
17. **Three rounds at most:** critique, fix the top three, look again. Stop when nothing is left that a stranger would notice. Report the real score: never round up.
|
|
29
|
+
|
|
30
|
+
Never do:
|
|
31
|
+
- Refill a gap with an ornament: close it, enlarge what remains, or let a picture take the space.
|
|
32
|
+
- Trust a page because the checks passed.
|
|
33
|
+
</constraints>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: prove-page
|
|
3
|
+
description: Use when a project has UI code and no page gate, when doctor asks for gates.a11y, or when a page needs proof before it ships.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Build the gate that proves a page, rendered
|
|
7
|
+
|
|
8
|
+
<constraints>
|
|
9
|
+
Always do:
|
|
10
|
+
1. Use the test runner the project has. Playwright is the usual one: pin it through `latest-versions`, with `@axe-core/playwright` for accessibility.
|
|
11
|
+
2. Open each key page in a real browser, on the production build, at three widths: 1440, 768 and 390.
|
|
12
|
+
3. Measure with `.claude/tools/page-measure.mjs`: `const facts = await page.evaluate(measure)`, then `expect(judge(facts)).toEqual([])`. Then assert, per page and width:
|
|
13
|
+
- no axe violations at the WCAG A and AA levels, in both colour schemes;
|
|
14
|
+
- no horizontal overflow, and no text clipped or covered;
|
|
15
|
+
- headlines at two lines or fewer, and a single `h1`;
|
|
16
|
+
- no broken images, no uncaught script errors, and text visible at rest.
|
|
17
|
+
4. Seed a planted fault for each kind and see the gate red before trusting it (`hooks-and-gates`).
|
|
18
|
+
5. Name the command in `.claude/layout.json` as `"gates": { "a11y": "<command>" }`.
|
|
19
|
+
|
|
20
|
+
Never do:
|
|
21
|
+
- Run it only on the dev server: minifiers and bundlers change what ships.
|
|
22
|
+
- Treat a pass as "accessible": automated checks catch only part of it. Keyboard and screen-reader passes stay by hand.
|
|
23
|
+
</constraints>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: redesign-page
|
|
3
|
+
description: Use when asked to redesign, restyle or review an existing page or screen.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Redesign what exists without breaking it (one job: better, with the same things still working)
|
|
7
|
+
|
|
8
|
+
<constraints>
|
|
9
|
+
Always do:
|
|
10
|
+
1. Record the before: run the project, screenshot it at every width, and take its measurements (`prove-page`). Read the code: the framework, the styling method, the components, and what must survive: routes, forms, data, behaviour, the brand's own assets.
|
|
11
|
+
2. A review stops here: critique the screenshots (`page-critique`), list the findings with their measurements, and name the three changes that would move it most.
|
|
12
|
+
3. Keep the stack, the content and what works. No framework or styling migration; check the dependency file before adding anything.
|
|
13
|
+
4. Work in order of biggest effect for least risk: type, colour, the frame (margins, section rhythm, a title and headings), states (hover, focus, loading, empty, error), then the stock components.
|
|
14
|
+
5. Prove it: measure again, compare before and after at every width, click through every link, form and menu that worked before, and report both sets of measurements side by side.
|
|
15
|
+
|
|
16
|
+
Never do:
|
|
17
|
+
- Change behaviour during a restyle.
|
|
18
|
+
- Report a redesign without the before.
|
|
19
|
+
</constraints>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ui-code-review
|
|
3
|
+
description: Use when asked to review UI code, audit a page's source for accessibility or UX, or before handing a screen to design-review.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Review UI code against the laws (one job: findings by file and line)
|
|
7
|
+
|
|
8
|
+
Reads the source. For judging the rendered page, use `design-review`.
|
|
9
|
+
|
|
10
|
+
<constraints>
|
|
11
|
+
Always do:
|
|
12
|
+
1. Read the named files; ask which ones if none are named.
|
|
13
|
+
2. Go through the `ui-craft` rules in order: forms, motion, real data, URL state, touch, dates and numbers, copy, type and space, generated look. Then the `accessibility` rule where it is installed.
|
|
14
|
+
3. Report terse findings by file, in `file:line` form, one line each: what is wrong and the fix.
|
|
15
|
+
4. Rank them: **P0** blocks someone from using it, **P1** hurts many people, **P2** hurts a few, **P3** polish. A file with nothing to report says so in one line.
|
|
16
|
+
5. Treat a `WARN`-level taste finding as wrong unless it can be defended to a designer in one sentence.
|
|
17
|
+
|
|
18
|
+
Never do:
|
|
19
|
+
- Rewrite the code during the review.
|
|
20
|
+
- Rank a generated-look finding above an accessibility one.
|
|
21
|
+
- Call something a law when it is taste: say which.
|
|
22
|
+
</constraints>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: write-the-page
|
|
3
|
+
description: Use when a page needs its words: a landing page, a product page, a headline, or copy that reads as templated.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Write the page before building it (one job: an argument, not sections)
|
|
7
|
+
|
|
8
|
+
<constraints>
|
|
9
|
+
Always do:
|
|
10
|
+
1. Answer in one line each: who is reading, and what do they already know? What is this, said the way its maker would say it to a friend? What one thing should they believe after one screen? What would make them believe it? What do they do next?
|
|
11
|
+
2. List the page as claims, one per section, each with its proof. A section with no claim is filler. The order of the argument is the order of the page.
|
|
12
|
+
3. Budget the headline: characters per line is about line width divided by (font size x 0.5). About 32 characters, four to six words, survives every width at a confident size. Up to about 42 if the phone size comes down. Past that, you are writing a sentence: move the rest to the supporting line.
|
|
13
|
+
4. Pick the plainest shape that is true: the name; what it is ("Furniture for small rooms"); the claim ("Your bank won't do this"); the instruction ("Understand your money").
|
|
14
|
+
5. Control the break: `max-width` in `ch`, `text-wrap: balance`, an authored `<br>` where it matters, checked on the phone. Section headings are two to five words.
|
|
15
|
+
6. Keep a statement a paragraph: an intro sentence set large is a `<p>` of about 25 words, at 36px or less on desktop and 24px on a phone.
|
|
16
|
+
7. List sample details for the owner to confirm. Proof is never invented.
|
|
17
|
+
|
|
18
|
+
Never do:
|
|
19
|
+
- Fix a long headline only by shrinking it: five words at 64px beats nine at 28px.
|
|
20
|
+
- Leave a single orphan word on line two: cut a word.
|
|
21
|
+
</constraints>
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// What a page gate measures in a real browser (0.22.0; the measurements come from taste-skill's inspector, written for the kit). measure()
|
|
2
|
+
// runs in the page, with no dependencies: `const facts = await page.evaluate(measure)` in Playwright, at each width. judge(facts) lists what fails.
|
|
3
|
+
// It is a floor, beside axe: `prove-page` says how to build the gate around it.
|
|
4
|
+
export function measure() {
|
|
5
|
+
const vw = document.documentElement.clientWidth;
|
|
6
|
+
const seen = (el) => { const s = getComputedStyle(el); const r = el.getBoundingClientRect(); return s.display !== 'none' && s.visibility !== 'hidden' && r.width > 0 && r.height > 0; };
|
|
7
|
+
const lines = (el) => {
|
|
8
|
+
const range = document.createRange();
|
|
9
|
+
range.selectNodeContents(el);
|
|
10
|
+
return new Set([...range.getClientRects()].filter((r) => r.width > 1).map((r) => Math.round(r.top / 4))).size;
|
|
11
|
+
};
|
|
12
|
+
const headings = [...document.querySelectorAll('h1,h2,h3,h4,h5,h6')].filter(seen);
|
|
13
|
+
const texts = [...document.querySelectorAll('p,li,td,th,a,button,label,span')].filter((el) => seen(el) && [...el.childNodes].some((n) => n.nodeType === 3 && n.textContent.trim()));
|
|
14
|
+
const levels = headings.map((h) => Number(h.tagName[1]));
|
|
15
|
+
const blocks = [...document.body.children].filter(seen).map((el) => el.getBoundingClientRect());
|
|
16
|
+
return {
|
|
17
|
+
width: vw,
|
|
18
|
+
h1s: headings.filter((h) => h.tagName === 'H1').length,
|
|
19
|
+
skippedHeading: levels.some((l, i) => i > 0 && l > levels[i - 1] + 1),
|
|
20
|
+
overflowX: document.documentElement.scrollWidth > vw + 1,
|
|
21
|
+
overflowing: [...document.querySelectorAll('body *')].filter((el) => seen(el) && el.getBoundingClientRect().right > vw + 1).slice(0, 5).map((el) => el.tagName.toLowerCase()),
|
|
22
|
+
longHeadlines: headings.filter((h) => lines(h) > 2).map((h) => h.textContent.trim().slice(0, 60)),
|
|
23
|
+
tinyText: texts.filter((el) => parseFloat(getComputedStyle(el).fontSize) < 12).slice(0, 5).map((el) => el.textContent.trim().slice(0, 40)),
|
|
24
|
+
brokenImages: [...document.images].filter((i) => i.complete && i.naturalWidth === 0).map((i) => i.getAttribute('src') ?? ''),
|
|
25
|
+
hiddenAtRest: texts.filter((el) => parseFloat(getComputedStyle(el).opacity) === 0).length,
|
|
26
|
+
margins: blocks.length ? [Math.round(Math.min(...blocks.map((b) => b.left))), Math.round(vw - Math.max(...blocks.map((b) => b.right)))] : [0, 0],
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const LAWS = {
|
|
31
|
+
h1s: (f) => f.h1s !== 1 && `${f.h1s} h1 on the page; one says what this is`,
|
|
32
|
+
skippedHeading: (f) => f.skippedHeading && 'a heading level is skipped',
|
|
33
|
+
overflowX: (f) => f.overflowX && `the page scrolls sideways at ${f.width}px (${f.overflowing.join(', ')})`,
|
|
34
|
+
longHeadlines: (f) => f.longHeadlines.length > 0 && `headline over two lines: ${f.longHeadlines[0]}`,
|
|
35
|
+
tinyText: (f) => f.tinyText.length > 0 && `text under 12px: ${f.tinyText[0]}`,
|
|
36
|
+
brokenImages: (f) => f.brokenImages.length > 0 && `broken image: ${f.brokenImages[0]}`,
|
|
37
|
+
hiddenAtRest: (f) => f.hiddenAtRest > 0 && `${f.hiddenAtRest} text element(s) hidden at rest`,
|
|
38
|
+
margins: (f) => Math.abs(f.margins[0] - f.margins[1]) > 2 && `unequal page margins: ${f.margins.join(' and ')}px`,
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export const judge = (facts) => Object.values(LAWS).map((law) => law(facts)).filter(Boolean);
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "a11y-img-needs-alt",
|
|
3
|
+
"why": "An <img> with no alt attribute reads its filename to screen readers. Describe it, or alt=\"\" for decorative.",
|
|
4
|
+
"rule": ".claude/rules/accessibility.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(?![^>]*\\balt\\s*=)[^>]*>",
|
|
24
|
+
"bad": "<img src=\"/hero.png\" width=\"800\" height=\"400\">",
|
|
25
|
+
"good": "<img src=\"/hero.png\" alt=\"The Decipherist studio desk\" width=\"800\" height=\"400\">\n<img src=\"/divider.svg\" alt=\"\" width=\"40\" height=\"4\">"
|
|
26
|
+
}
|