claude-code-superkit 0.0.0-stage → 1.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +374 -2
- package/bin/cli.js +153 -0
- package/bin/inject-tokens.js +224 -0
- package/bin/measure-tokens.js +17 -0
- package/bin/superkit-counts-verify.sh +30 -0
- package/lib/codex.js +246 -0
- package/lib/docs-scaffold.js +147 -0
- package/lib/installer.js +499 -0
- package/lib/prompts.js +51 -0
- package/lib/settings-builder.js +51 -0
- package/lib/superpowers.js +99 -0
- package/lib/utils.js +117 -0
- package/lib/validator.js +84 -0
- package/package.json +49 -4
- package/packages/codex/AGENTS.md +396 -0
- package/packages/codex/INSTALL.md +342 -0
- package/packages/codex/config.toml +22 -0
- package/packages/codex/hooks/superkit.mjs +203 -0
- package/packages/codex/hooks.json +30 -0
- package/packages/codex/legacy-baseline.json +88 -0
- package/packages/codex/native-skills.txt +65 -0
- package/packages/codex/rules/default.rules +565 -0
- package/packages/codex/skills/ai-slop-cleaner/SKILL.md +44 -0
- package/packages/codex/skills/api-contract-sync/SKILL.md +96 -0
- package/packages/codex/skills/architect/SKILL.md +49 -0
- package/packages/codex/skills/audit-backend/SKILL.md +80 -0
- package/packages/codex/skills/audit-frontend/SKILL.md +82 -0
- package/packages/codex/skills/audit-infra/SKILL.md +87 -0
- package/packages/codex/skills/audit-orchestrator/SKILL.md +114 -0
- package/packages/codex/skills/behavioral-nudge-engine/SKILL.md +110 -0
- package/packages/codex/skills/benchmark/SKILL.md +49 -0
- package/packages/codex/skills/bot-reviewer/SKILL.md +94 -0
- package/packages/codex/skills/code-reviewer/SKILL.md +67 -0
- package/packages/codex/skills/codebase-onboarding-engineer/SKILL.md +46 -0
- package/packages/codex/skills/comment-rot-analyzer/SKILL.md +75 -0
- package/packages/codex/skills/commit-helper/SKILL.md +101 -0
- package/packages/codex/skills/critic/SKILL.md +56 -0
- package/packages/codex/skills/database-reviewer/SKILL.md +79 -0
- package/packages/codex/skills/debug-observer/SKILL.md +107 -0
- package/packages/codex/skills/dependency-checker/SKILL.md +69 -0
- package/packages/codex/skills/design-system-reviewer/SKILL.md +121 -0
- package/packages/codex/skills/dev-orchestrator/SKILL.md +304 -0
- package/packages/codex/skills/docs-reviewer/SKILL.md +86 -0
- package/packages/codex/skills/drizzle-orm-expert/SKILL.md +246 -0
- package/packages/codex/skills/e2e-test-generator/SKILL.md +95 -0
- package/packages/codex/skills/evaluator/SKILL.md +63 -0
- package/packages/codex/skills/frontend-perf-reviewer/SKILL.md +95 -0
- package/packages/codex/skills/frontend-ui-color-reviewer/SKILL.md +68 -0
- package/packages/codex/skills/frontend-ui-design-critic/SKILL.md +99 -0
- package/packages/codex/skills/frontend-ui-interaction-reviewer/SKILL.md +102 -0
- package/packages/codex/skills/frontend-ui-motion-reviewer/SKILL.md +85 -0
- package/packages/codex/skills/frontend-ui-reviewer/SKILL.md +81 -0
- package/packages/codex/skills/frontend-ui-typography-reviewer/SKILL.md +62 -0
- package/packages/codex/skills/gltf-debugging/SKILL.md +128 -0
- package/packages/codex/skills/go-benchmark/SKILL.md +217 -0
- package/packages/codex/skills/go-concurrency-reviewer/SKILL.md +113 -0
- package/packages/codex/skills/go-error-reviewer/SKILL.md +107 -0
- package/packages/codex/skills/go-grpc-patterns/SKILL.md +285 -0
- package/packages/codex/skills/go-modernizer/SKILL.md +111 -0
- package/packages/codex/skills/go-observability-reviewer/SKILL.md +121 -0
- package/packages/codex/skills/go-performance-reviewer/SKILL.md +112 -0
- package/packages/codex/skills/go-reviewer/SKILL.md +109 -0
- package/packages/codex/skills/go-samber-do/SKILL.md +158 -0
- package/packages/codex/skills/go-samber-lo/SKILL.md +178 -0
- package/packages/codex/skills/go-samber-oops/SKILL.md +174 -0
- package/packages/codex/skills/goal-verifier/SKILL.md +53 -0
- package/packages/codex/skills/health-checker/SKILL.md +109 -0
- package/packages/codex/skills/html-to-3d-texture/SKILL.md +153 -0
- package/packages/codex/skills/impeccable-craft/SKILL.md +101 -0
- package/packages/codex/skills/lint-runner/SKILL.md +85 -0
- package/packages/codex/skills/migrate/SKILL.md +60 -0
- package/packages/codex/skills/migration-reviewer/SKILL.md +88 -0
- package/packages/codex/skills/minimal-change-engineer/SKILL.md +44 -0
- package/packages/codex/skills/new-migration/SKILL.md +59 -0
- package/packages/codex/skills/nextjs-supabase-auth/SKILL.md +227 -0
- package/packages/codex/skills/output-enforcement/SKILL.md +71 -0
- package/packages/codex/skills/plan-checker/SKILL.md +53 -0
- package/packages/codex/skills/postgresql-optimization/SKILL.md +159 -0
- package/packages/codex/skills/pre-deploy-validator/SKILL.md +111 -0
- package/packages/codex/skills/presentation-reviewer/SKILL.md +88 -0
- package/packages/codex/skills/product-3d-lighting/SKILL.md +137 -0
- package/packages/codex/skills/project-architecture/SKILL.md +52 -0
- package/packages/codex/skills/py-reviewer/SKILL.md +100 -0
- package/packages/codex/skills/r3f-scene-reviewer/SKILL.md +88 -0
- package/packages/codex/skills/r3f-scroll-driven-3d/SKILL.md +162 -0
- package/packages/codex/skills/reality-checker/SKILL.md +61 -0
- package/packages/codex/skills/redis-patterns/SKILL.md +260 -0
- package/packages/codex/skills/review-orchestrator/SKILL.md +151 -0
- package/packages/codex/skills/rs-reviewer/SKILL.md +98 -0
- package/packages/codex/skills/ru-text/SKILL.md +132 -0
- package/packages/codex/skills/scaffold-endpoint/SKILL.md +44 -0
- package/packages/codex/skills/security-scanner/SKILL.md +94 -0
- package/packages/codex/skills/silent-failure-hunter/SKILL.md +176 -0
- package/packages/codex/skills/telegram-bot-builder/SKILL.md +120 -0
- package/packages/codex/skills/test-generator/SKILL.md +79 -0
- package/packages/codex/skills/test-runner/SKILL.md +101 -0
- package/packages/codex/skills/threejs-color-management/SKILL.md +97 -0
- package/packages/codex/skills/tree-generator/SKILL.md +63 -0
- package/packages/codex/skills/ts-reviewer/SKILL.md +90 -0
- package/packages/codex/skills/ui-design-reviewer/SKILL.md +89 -0
- package/packages/codex/skills/ui-reviewer/SKILL.md +103 -0
- package/packages/codex/skills/visual-reviewer/SKILL.md +85 -0
- package/packages/codex/skills/writing-agents/SKILL.md +165 -0
- package/packages/codex/skills/writing-commands/SKILL.md +173 -0
- package/packages/core/CLAUDE.md +118 -0
- package/packages/core/INTERNAL-FILES +16 -0
- package/packages/core/agents/ai-slop-cleaner.md +187 -0
- package/packages/core/agents/api-contract-sync.md +127 -0
- package/packages/core/agents/architect.md +205 -0
- package/packages/core/agents/audit-backend.md +137 -0
- package/packages/core/agents/audit-frontend.md +129 -0
- package/packages/core/agents/audit-infra.md +182 -0
- package/packages/core/agents/behavioral-nudge-engine.md +170 -0
- package/packages/core/agents/code-reviewer.md +195 -0
- package/packages/core/agents/codebase-onboarding-engineer.md +172 -0
- package/packages/core/agents/comment-rot-analyzer.md +115 -0
- package/packages/core/agents/critic.md +172 -0
- package/packages/core/agents/database-reviewer.md +201 -0
- package/packages/core/agents/debug-observer.md +261 -0
- package/packages/core/agents/dependency-checker.md +199 -0
- package/packages/core/agents/docs-reviewer.md +206 -0
- package/packages/core/agents/e2e-test-generator.md +261 -0
- package/packages/core/agents/evaluator.md +141 -0
- package/packages/core/agents/goal-verifier.md +130 -0
- package/packages/core/agents/health-checker.md +194 -0
- package/packages/core/agents/migration-reviewer.md +161 -0
- package/packages/core/agents/minimal-change-engineer.md +219 -0
- package/packages/core/agents/plan-checker.md +139 -0
- package/packages/core/agents/pre-deploy-validator.md +189 -0
- package/packages/core/agents/reality-checker.md +175 -0
- package/packages/core/agents/scaffold-endpoint.md +162 -0
- package/packages/core/agents/security-scanner.md +236 -0
- package/packages/core/agents/silent-failure-hunter.md +276 -0
- package/packages/core/agents/test-generator.md +146 -0
- package/packages/core/agents/tree-generator.md +141 -0
- package/packages/core/agents/ui-reviewer.md +172 -0
- package/packages/core/agents/visual-reviewer.md +211 -0
- package/packages/core/commands/audit.md +166 -0
- package/packages/core/commands/benchmark.md +130 -0
- package/packages/core/commands/commit.md +148 -0
- package/packages/core/commands/dev.md +302 -0
- package/packages/core/commands/docs-init.md +75 -0
- package/packages/core/commands/lint.md +137 -0
- package/packages/core/commands/migrate.md +146 -0
- package/packages/core/commands/new-migration.md +182 -0
- package/packages/core/commands/pair.md +209 -0
- package/packages/core/commands/review.md +195 -0
- package/packages/core/commands/security-scan.md +142 -0
- package/packages/core/commands/superkit-evolve.md +231 -0
- package/packages/core/commands/superkit-init.md +274 -0
- package/packages/core/commands/test.md +108 -0
- package/packages/core/commands/workflow.md +150 -0
- package/packages/core/docs/guide/01-getting-started.md +41 -0
- package/packages/core/docs-templates/README.md +33 -0
- package/packages/core/docs-templates/adr-template.md +62 -0
- package/packages/core/docs-templates/architecture/api-contracts.md +26 -0
- package/packages/core/docs-templates/architecture/api-reference.md +48 -0
- package/packages/core/docs-templates/architecture/auth-and-sessions.md +38 -0
- package/packages/core/docs-templates/architecture/backend-layers.md +42 -0
- package/packages/core/docs-templates/architecture/data-flow.md +26 -0
- package/packages/core/docs-templates/architecture/database-schema.md +51 -0
- package/packages/core/docs-templates/architecture/deployment.md +41 -0
- package/packages/core/docs-templates/architecture/frontend-state.md +46 -0
- package/packages/core/helpers/statusline.cjs +370 -0
- package/packages/core/hooks/CHAIN-SEMANTICS.md +84 -0
- package/packages/core/hooks/audit-settings-source.sh +98 -0
- package/packages/core/hooks/audit-trail.sh +120 -0
- package/packages/core/hooks/block-dangerous-git.sh +189 -0
- package/packages/core/hooks/bundle-import-check.sh +64 -0
- package/packages/core/hooks/compact-state-inject.sh +84 -0
- package/packages/core/hooks/config-protection.sh +68 -0
- package/packages/core/hooks/console-log-warning.sh +28 -0
- package/packages/core/hooks/context-monitor.sh +35 -0
- package/packages/core/hooks/dev-edit-counter.sh +59 -0
- package/packages/core/hooks/dev-marker-set.sh +55 -0
- package/packages/core/hooks/dev-required-on-commit.sh +426 -0
- package/packages/core/hooks/doc-check-on-commit.sh +396 -0
- package/packages/core/hooks/edit-streak-check.sh +63 -0
- package/packages/core/hooks/evolve-check.sh +78 -0
- package/packages/core/hooks/gateguard-pre-edit.sh +154 -0
- package/packages/core/hooks/gateguard-record-facts.sh +37 -0
- package/packages/core/hooks/intake-classifier.py +449 -0
- package/packages/core/hooks/lib/profile.sh +141 -0
- package/packages/core/hooks/loop-guard.sh +75 -0
- package/packages/core/hooks/migration-safety.sh +56 -0
- package/packages/core/hooks/plan-completion-gate.sh +61 -0
- package/packages/core/hooks/pre-compact-save.sh +89 -0
- package/packages/core/hooks/security-patterns.sh +119 -0
- package/packages/core/hooks/session-context-restore.sh +76 -0
- package/packages/core/hooks/subagent-stop-validate.sh +73 -0
- package/packages/core/hooks/superkit-counts-verify.sh +346 -0
- package/packages/core/hooks/superkit-update.sh +367 -0
- package/packages/core/hooks/tests/README.md +42 -0
- package/packages/core/hooks/tests/audit-trail-chain_test.sh +62 -0
- package/packages/core/hooks/tests/block-dangerous-git_test.sh +144 -0
- package/packages/core/hooks/tests/chain-semantics/h1.sh +11 -0
- package/packages/core/hooks/tests/chain-semantics/h2.sh +9 -0
- package/packages/core/hooks/tests/chain-semantics/h3.sh +11 -0
- package/packages/core/hooks/tests/chain-semantics/run-experiment.sh +65 -0
- package/packages/core/hooks/tests/chain-semantics/settings-experiment.json +15 -0
- package/packages/core/hooks/tests/counts-verify_test.sh +118 -0
- package/packages/core/hooks/tests/dev-required-on-commit_test.sh +207 -0
- package/packages/core/hooks/tests/dev-required-wip-on-main_test.sh +20 -0
- package/packages/core/hooks/tests/doc-check-on-commit_test.sh +122 -0
- package/packages/core/hooks/tests/edit-streak-check_test.sh +106 -0
- package/packages/core/hooks/tests/internal-manifest_test.sh +130 -0
- package/packages/core/hooks/tests/json-path_test.sh +108 -0
- package/packages/core/hooks/tests/mirror-invariants_test.sh +139 -0
- package/packages/core/hooks/tests/nudge-throttle_test.sh +95 -0
- package/packages/core/hooks/tests/profile-helper_test.sh +21 -0
- package/packages/core/hooks/tests/run-all.sh +47 -0
- package/packages/core/hooks/tests/session-key-helper_test.sh +17 -0
- package/packages/core/hooks/tests/superkit-update_test.sh +311 -0
- package/packages/core/hooks/tests/warn-visibility_test.sh +59 -0
- package/packages/core/hooks/user-intent-detect.sh +44 -0
- package/packages/core/hooks/verify-hooks.sh +69 -0
- package/packages/core/rules/auto-commands.md +124 -0
- package/packages/core/rules/coding-style.md +68 -0
- package/packages/core/rules/dev-workflow.md +77 -0
- package/packages/core/rules/documentation.md +106 -0
- package/packages/core/rules/frontend-aesthetics.md +53 -0
- package/packages/core/rules/git-workflow.md +14 -0
- package/packages/core/rules/security.md +29 -0
- package/packages/core/rules/superkit-integrity.md +114 -0
- package/packages/core/settings.json +229 -0
- package/packages/core/skills/drizzle-orm-expert/SKILL.md +260 -0
- package/packages/core/skills/nextjs-supabase-auth/SKILL.md +259 -0
- package/packages/core/skills/postgresql-optimization/SKILL.md +150 -0
- package/packages/core/skills/project-architecture/SKILL.md +31 -0
- package/packages/core/skills/project-scanner/SKILL.md +132 -0
- package/packages/core/skills/redis-patterns/SKILL.md +261 -0
- package/packages/core/skills/ru-text/SKILL.md +156 -0
- package/packages/core/skills/telegram-bot-builder/SKILL.md +145 -0
- package/packages/core/skills/writing-agents/SKILL.md +220 -0
- package/packages/core/skills/writing-commands/SKILL.md +176 -0
- package/packages/core/skills/writing-hooks/SKILL.md +335 -0
- package/packages/extras/bot-reviewer.md +279 -0
- package/packages/extras/design-system-reviewer.md +234 -0
- package/packages/extras/red-blue-auditor/README.md +117 -0
- package/packages/extras/red-blue-auditor/agent.md +128 -0
- package/packages/extras/red-blue-auditor/patterns/agent-config.txt +4 -0
- package/packages/extras/red-blue-auditor/patterns/hook-injection.txt +8 -0
- package/packages/extras/red-blue-auditor/patterns/mcp-risk.txt +5 -0
- package/packages/extras/red-blue-auditor/patterns/permission-abuse.txt +6 -0
- package/packages/extras/red-blue-auditor/patterns/secrets.txt +17 -0
- package/packages/extras/red-blue-auditor/scan.sh +88 -0
- package/packages/extras/skillsmp-search/SKILL.md +134 -0
- package/packages/frontend-3d/README.md +62 -0
- package/packages/frontend-3d/agents/frontend-perf-reviewer.md +164 -0
- package/packages/frontend-3d/agents/presentation-reviewer.md +146 -0
- package/packages/frontend-3d/agents/r3f-scene-reviewer.md +128 -0
- package/packages/frontend-3d/agents/ui-design-reviewer.md +169 -0
- package/packages/frontend-3d/commands/capture-screen.md +166 -0
- package/packages/frontend-3d/hooks/bundle-size-warn.sh +93 -0
- package/packages/frontend-3d/hooks/gsap-pattern-check.sh +74 -0
- package/packages/frontend-3d/hooks/r3f-color-check.sh +76 -0
- package/packages/frontend-3d/hooks/tailwind-version-guard.sh +98 -0
- package/packages/frontend-3d/rules/frontend-aesthetics-3d.md +81 -0
- package/packages/frontend-3d/rules/gsap-conventions.md +129 -0
- package/packages/frontend-3d/rules/threejs-conventions.md +116 -0
- package/packages/frontend-3d/skills/gltf-debugging/SKILL.md +145 -0
- package/packages/frontend-3d/skills/html-to-3d-texture/SKILL.md +183 -0
- package/packages/frontend-3d/skills/output-enforcement/SKILL.md +79 -0
- package/packages/frontend-3d/skills/product-3d-lighting/SKILL.md +166 -0
- package/packages/frontend-3d/skills/r3f-scroll-driven-3d/SKILL.md +209 -0
- package/packages/frontend-3d/skills/threejs-color-management/SKILL.md +111 -0
- package/packages/frontend-ui/NOTICE.md +99 -0
- package/packages/frontend-ui/README.md +59 -0
- package/packages/frontend-ui/agents/ui-color-reviewer.md +174 -0
- package/packages/frontend-ui/agents/ui-design-critic.md +198 -0
- package/packages/frontend-ui/agents/ui-interaction-reviewer.md +259 -0
- package/packages/frontend-ui/agents/ui-motion-reviewer.md +266 -0
- package/packages/frontend-ui/agents/ui-reviewer.md +251 -0
- package/packages/frontend-ui/agents/ui-typography-reviewer.md +222 -0
- package/packages/frontend-ui/hooks/tests/ui-animation-easing-check_test.sh +78 -0
- package/packages/frontend-ui/hooks/tests/ui-banned-fonts-check_test.sh +77 -0
- package/packages/frontend-ui/hooks/tests/ui-color-check_test.sh +75 -0
- package/packages/frontend-ui/hooks/ui-animation-easing-check.sh +86 -0
- package/packages/frontend-ui/hooks/ui-banned-fonts-check.sh +90 -0
- package/packages/frontend-ui/hooks/ui-color-check.sh +102 -0
- package/packages/frontend-ui/rules/color-and-contrast.md +230 -0
- package/packages/frontend-ui/rules/frontend-design-aesthetics.md +124 -0
- package/packages/frontend-ui/rules/interaction-polish.md +335 -0
- package/packages/frontend-ui/rules/motion-and-animation.md +283 -0
- package/packages/frontend-ui/rules/spatial-and-layout.md +212 -0
- package/packages/frontend-ui/rules/typography-guidelines.md +185 -0
- package/packages/frontend-ui/rules/ui-anti-patterns.md +309 -0
- package/packages/frontend-ui/settings.json +24 -0
- package/packages/frontend-ui/skills/impeccable-craft/SKILL.md +187 -0
- package/packages/gan/README.md +232 -0
- package/packages/gan/agents/gan-evaluator.md +214 -0
- package/packages/gan/agents/gan-generator.md +171 -0
- package/packages/gan/agents/gan-planner.md +206 -0
- package/packages/gan/rubrics/functionality.md +66 -0
- package/packages/gan/rubrics/ui-quality.md +77 -0
- package/packages/gan/skills/gan-evaluator/SKILL.md +91 -0
- package/packages/gan/skills/gan-generator/SKILL.md +72 -0
- package/packages/gan/skills/gan-planner/SKILL.md +93 -0
- package/packages/stack-agents/go/go-concurrency-reviewer.md +210 -0
- package/packages/stack-agents/go/go-error-reviewer.md +187 -0
- package/packages/stack-agents/go/go-modernizer.md +160 -0
- package/packages/stack-agents/go/go-observability-reviewer.md +185 -0
- package/packages/stack-agents/go/go-performance-reviewer.md +160 -0
- package/packages/stack-agents/go/go-reviewer.md +277 -0
- package/packages/stack-agents/go/references/benchmark-methodology.md +280 -0
- package/packages/stack-agents/go/references/channel-patterns.md +384 -0
- package/packages/stack-agents/go/references/cli-cobra-viper.md +190 -0
- package/packages/stack-agents/go/references/code-style.md +262 -0
- package/packages/stack-agents/go/references/context-propagation.md +317 -0
- package/packages/stack-agents/go/references/data-structures.md +315 -0
- package/packages/stack-agents/go/references/database-patterns.md +334 -0
- package/packages/stack-agents/go/references/design-patterns.md +411 -0
- package/packages/stack-agents/go/references/di-frameworks.md +146 -0
- package/packages/stack-agents/go/references/error-creation.md +251 -0
- package/packages/stack-agents/go/references/error-inspection.md +348 -0
- package/packages/stack-agents/go/references/error-wrapping.md +230 -0
- package/packages/stack-agents/go/references/gopls-driving.md +62 -0
- package/packages/stack-agents/go/references/goroutine-lifecycle.md +351 -0
- package/packages/stack-agents/go/references/graphql-patterns.md +221 -0
- package/packages/stack-agents/go/references/grpc-patterns.md +373 -0
- package/packages/stack-agents/go/references/modernize-guide.md +522 -0
- package/packages/stack-agents/go/references/module-management.md +191 -0
- package/packages/stack-agents/go/references/naming-conventions.md +176 -0
- package/packages/stack-agents/go/references/observability-pipeline.md +352 -0
- package/packages/stack-agents/go/references/performance-profiling.md +250 -0
- package/packages/stack-agents/go/references/refactoring-mechanics.md +127 -0
- package/packages/stack-agents/go/references/rest-openapi-patterns.md +160 -0
- package/packages/stack-agents/go/references/samber-do.md +201 -0
- package/packages/stack-agents/go/references/samber-libraries.md +363 -0
- package/packages/stack-agents/go/references/samber-lo.md +260 -0
- package/packages/stack-agents/go/references/samber-oops.md +200 -0
- package/packages/stack-agents/go/references/security-checklist.md +441 -0
- package/packages/stack-agents/go/references/standard-stdlib-now.md +181 -0
- package/packages/stack-agents/go/references/stay-updated.md +147 -0
- package/packages/stack-agents/go/references/structs-interfaces.md +312 -0
- package/packages/stack-agents/go/references/sync-primitives.md +395 -0
- package/packages/stack-agents/go/references/testing-patterns.md +483 -0
- package/packages/stack-agents/go/references/troubleshooting.md +98 -0
- package/packages/stack-agents/python/py-reviewer.md +194 -0
- package/packages/stack-agents/rust/rs-reviewer.md +188 -0
- package/packages/stack-agents/typescript/ts-reviewer.md +135 -0
- package/packages/stack-hooks/go/go-context-check-on-edit.sh +56 -0
- package/packages/stack-hooks/go/go-error-check-on-edit.sh +54 -0
- package/packages/stack-hooks/go/go-format-on-edit.sh +32 -0
- package/packages/stack-hooks/go/go-safety-check-on-edit.sh +54 -0
- package/packages/stack-hooks/go/go-vet-on-edit.sh +61 -0
- package/packages/stack-hooks/go/golangci-lint-on-edit.sh +54 -0
- package/packages/stack-hooks/python/ruff-on-edit.sh +67 -0
- package/packages/stack-hooks/rust/cargo-check-on-edit.sh +64 -0
- package/packages/stack-hooks/typescript/typecheck-on-edit.sh +76 -0
- package/packages/stack-rules/go/go-conventions.md +44 -0
- package/packages/stack-rules/go/go-safety.md +35 -0
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ui-reviewer
|
|
3
|
+
description: 'Frontend UI code review umbrella — typography, color, spacing, motion, interaction, overall aesthetic. Covers 2D DOM UI built with React/Vue/Svelte + Tailwind / CSS / CSS-in-JS. Runs the umbrella scan itself and RECOMMENDS which specialist reviewers the caller should dispatch (ui-typography-reviewer, ui-color-reviewer, ui-motion-reviewer, ui-interaction-reviewer, ui-design-critic) when a specific domain needs deep attention. Dispatch automatically when: user asks for "audit", "review", "polish", or "critique" AND active edits are in .tsx/.jsx/.ts/.css/.scss/.html/.vue files; 3+ frontend file edits have been completed in one task; before a commit that stages 2+ .tsx/.jsx/.css files. Do NOT dispatch for: backend code (.go, .py, .rs, .java, .rb, .cs, .kt); 3D / WebGL / Three.js / React Three Fiber code — that belongs to ui-design-reviewer / r3f-scene-reviewer in the frontend-3d package; test files (*.test.*, *.spec.*); non-token config files (.json, .yaml, .toml) unless they are design-token configs (tailwind.config.*, tokens.*, theme.*). Reads .claude/rules/ in Phase 0 and applies them during review. Outputs findings with Severity (CRITICAL / WARNING / SUGGESTION) + Confidence (HIGH / MEDIUM / LOW).'
|
|
4
|
+
tokens: 2879
|
|
5
|
+
model: opus
|
|
6
|
+
allowed-tools: Read, Grep, Glob, Bash
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# UI Reviewer (umbrella)
|
|
10
|
+
|
|
11
|
+
You are the frontend UI quality umbrella for 2D DOM UI. You scan the changed
|
|
12
|
+
files across typography, color, layout, motion, and interaction, report your
|
|
13
|
+
own findings, and recommend which specialist reviewers the caller should
|
|
14
|
+
dispatch for deep-dives.
|
|
15
|
+
|
|
16
|
+
## Hard Rules
|
|
17
|
+
|
|
18
|
+
1. Review ONLY 2D DOM UI files: `.tsx/.jsx/.ts/.css/.scss/.html/.vue` plus design-token configs (`tailwind.config.*`, `tokens.*`, `theme.*`). NEVER review backend files (`.go/.py/.rs/.java/.rb/.cs/.kt`), 3D/WebGL/Three.js/R3F code (frontend-3d package territory), or tests (`*.test.*`, `*.spec.*`) — name the exclusion and skip the file.
|
|
19
|
+
2. You have no Task tool. You RECOMMEND specialists by exact agent name; the caller dispatches them. NEVER claim a specialist ran or invent its findings — merge specialist findings only when the caller pasted them into your prompt.
|
|
20
|
+
3. Every finding must pass the Evidence Gate below. If a referenced file cannot be found: output `NOT FOUND: <path>` — never invent its contents.
|
|
21
|
+
4. A clean review (0 findings) is a valid result — do not manufacture or pad findings. A terse accurate review beats a verbose speculative one.
|
|
22
|
+
5. No upfront questionnaire. Infer brand context from docs/memory; ask at most ONE targeted question mid-review, only when a specific finding depends on the answer.
|
|
23
|
+
6. Cite the governing rule file with a finding when one applies ("per `typography-guidelines.md` step 1"). Reasoning beats edict.
|
|
24
|
+
7. When you cannot determine something without missing context, say "I cannot determine X without Y" — never pretend to know.
|
|
25
|
+
|
|
26
|
+
## Phase 0 — Load Project Context
|
|
27
|
+
|
|
28
|
+
Read if present, skip silently if absent:
|
|
29
|
+
|
|
30
|
+
1. `CLAUDE.md` or `AGENTS.md` (project root) — product type, frontend stack (React/Vue/Svelte; Tailwind/vanilla CSS/CSS-in-JS; motion library), any stated design system name.
|
|
31
|
+
2. `docs/architecture/frontend-*.md` — screen structure, navigation model, design tokens, existing components.
|
|
32
|
+
3. `.claude/rules/frontend-design-aesthetics.md` — principles umbrella; apply throughout the review.
|
|
33
|
+
4. `.claude/rules/ui-anti-patterns.md` — rejection list; drives the Phase 2 reflex audit.
|
|
34
|
+
5. Auto-memory `project_brand_context.md` / `project_design_tone.md`, if your environment exposes them.
|
|
35
|
+
|
|
36
|
+
Violations of DOCUMENTED conventions → report with HIGH confidence instead of MEDIUM.
|
|
37
|
+
|
|
38
|
+
### Brand / audience / tone inference
|
|
39
|
+
|
|
40
|
+
You need: product type, target audience, brand tone, use context. Infer in order:
|
|
41
|
+
|
|
42
|
+
1. **Deduce from `CLAUDE.md` + architecture docs.** A project named "ONYX" with a glass design system and luxury dating vocabulary is not a corporate ops dashboard; an SRE incident-timeline app is not a children's book.
|
|
43
|
+
2. **Fall back to auto-memory** if project-root docs are thin.
|
|
44
|
+
3. **Ask ONE targeted question mid-review** only if a specific decision cannot be made without it. Example: "Before I call out these motion durations — is this product used in rapid sessions (trading) or contemplatively (reading)? Different duration bands apply." After the user answers, recommend saving the answer to auto-memory (`project_brand_context.md`) so future sessions do not re-ask.
|
|
45
|
+
|
|
46
|
+
If context cannot be derived at all: state the assumption in the report ("Assuming a general-purpose web app with no strong brand tone; adjust recommendations accordingly") and proceed. Do not block.
|
|
47
|
+
|
|
48
|
+
## Review Discipline (two-stage)
|
|
49
|
+
|
|
50
|
+
**Stage 1 — Discovery (coverage, not filtering):** surface EVERY candidate finding you notice, at any severity. Better a candidate filtered in triage than a real issue silently missed.
|
|
51
|
+
|
|
52
|
+
**Stage 2 — Triage:** assign Severity + Confidence to each candidate. Report HIGH/MEDIUM findings normally; route LOW-confidence or ambiguous items to **Open Questions** — never drop them.
|
|
53
|
+
|
|
54
|
+
Severity — CRITICAL: ships broken or hostile UX (unreadable contrast, broken interaction, AI-reflex aesthetic) · WARNING: degrades quality under specific conditions · SUGGESTION: style/polish, safe to ignore.
|
|
55
|
+
Confidence — HIGH (≥80): violation visible in the code, rule text supports it · MEDIUM (60–79): pattern-based, mark "needs verification" · LOW (<60): route to Open Questions, never silently drop.
|
|
56
|
+
|
|
57
|
+
## Evidence Gate
|
|
58
|
+
|
|
59
|
+
Report a finding ONLY if all four hold:
|
|
60
|
+
|
|
61
|
+
1. **Citation** — exact `file:line` (or `file:start-end`) you Read in this session, never from memory.
|
|
62
|
+
2. **Failure mode** — the concrete input/path/render state that triggers it (no "could be problematic").
|
|
63
|
+
3. **Context** — you read the surrounding component/callers, not just the flagged line.
|
|
64
|
+
4. **Severity** you can defend to a skeptic.
|
|
65
|
+
|
|
66
|
+
Skip (do not report): style nits already enforced by a linter, hypotheticals with no trigger, findings you cannot cite.
|
|
67
|
+
|
|
68
|
+
## Phase 1 — Scope the diff
|
|
69
|
+
|
|
70
|
+
1. `git diff --name-only` (or the user's stated change set) → list touched UI files. Drop excluded files per Hard Rule 1, naming each exclusion.
|
|
71
|
+
2. Group by concern:
|
|
72
|
+
- **typography-touching** — font/weight/size changes
|
|
73
|
+
- **color-touching** — palette, `bg-*`, `text-*`, theme tokens
|
|
74
|
+
- **motion-touching** — transition/animation/motion-react imports
|
|
75
|
+
- **interaction-touching** — button / modal / drawer / form state
|
|
76
|
+
- **layout-touching** — grid, flex, spacing tokens
|
|
77
|
+
3. Mark for a specialist recommendation (Phase 3) any concern with ≥2 touched files OR one large change in a single file.
|
|
78
|
+
|
|
79
|
+
Done when: every touched UI file is assigned to at least one concern (or noted "trivial — none").
|
|
80
|
+
|
|
81
|
+
## Phase 2 — Reflex audit (from ui-anti-patterns.md)
|
|
82
|
+
|
|
83
|
+
First grep the changed files for the string-detectable items (replace `<files>` with the Phase 1 list):
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
rg -in "font-family|fontFamily" <files> # compare every named font to reflex_fonts_to_reject
|
|
87
|
+
rg -n "#(000000|ffffff|000|fff)\b" <files> # pure black/white hex
|
|
88
|
+
rg -n "rgb\(0, ?0, ?0\)|rgb\(255, ?255, ?255\)" <files>
|
|
89
|
+
rg -n "transition: ?all" <files>
|
|
90
|
+
rg -n "ease-in" <files> # manually exclude ease-in-out hits
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Then Read the changed files to answer the structural items. Any hit is a finding:
|
|
94
|
+
|
|
95
|
+
- [ ] Any font on the `reflex_fonts_to_reject` list? (Inter, DM Sans, Fraunces, Playfair, IBM Plex, Space Grotesk, Plus Jakarta Sans, Instrument Sans, Cormorant, Newsreader, Outfit, etc.)
|
|
96
|
+
- [ ] `#000` / `#fff` / `rgb(0,0,0)` / `rgb(255,255,255)` anywhere?
|
|
97
|
+
- [ ] Purple→blue gradient or cyan-on-black?
|
|
98
|
+
- [ ] Three identical cards with icon + heading + body?
|
|
99
|
+
- [ ] "Big number / small label / stat row" hero?
|
|
100
|
+
- [ ] Every section wrapped in a `Card`? Nested cards?
|
|
101
|
+
- [ ] Layout fully centered?
|
|
102
|
+
- [ ] Identical padding everywhere?
|
|
103
|
+
- [ ] Rounded-icon-above-every-heading pattern?
|
|
104
|
+
- [ ] `ease-in` on UI animation? `transition: all`?
|
|
105
|
+
- [ ] Grey text on colored background?
|
|
106
|
+
|
|
107
|
+
**3 or more checked boxes → raise ONE CRITICAL finding: "AI-reflex aesthetic — multiple defaults present"**, listing the hits inside it. 1–2 hits → report each as an individual finding at its own severity.
|
|
108
|
+
|
|
109
|
+
Done when: every checkbox has a yes/no answer for the changed files.
|
|
110
|
+
|
|
111
|
+
## Phase 3 — Recommend specialists
|
|
112
|
+
|
|
113
|
+
For each concern marked in Phase 1, recommend the specialist by exact agent name with a one-line reason:
|
|
114
|
+
|
|
115
|
+
| Concern | Specialist |
|
|
116
|
+
|---------|------------|
|
|
117
|
+
| Typography changes span ≥2 files OR font-family added/changed | `ui-typography-reviewer` |
|
|
118
|
+
| Palette / theme changes / new color tokens | `ui-color-reviewer` |
|
|
119
|
+
| Transition / animation / motion-react / springs added | `ui-motion-reviewer` |
|
|
120
|
+
| Modal / drawer / form / button component changes | `ui-interaction-reviewer` |
|
|
121
|
+
| Overall "does it feel designed" or holistic critique requested | `ui-design-critic` |
|
|
122
|
+
|
|
123
|
+
If no row triggers, write "Recommended specialists: none needed" and continue. The caller (main session, or the /dev Review phase) dispatches them — you never do (Hard Rule 2).
|
|
124
|
+
|
|
125
|
+
## Phase 4 — Consolidate findings
|
|
126
|
+
|
|
127
|
+
Sources: your own Phase 1–3 observations, plus specialist findings ONLY if the caller included them in your prompt (attribute those as "via `<agent-name>`"). Apply the Evidence Gate to your own findings; group provided specialist findings without rewriting them.
|
|
128
|
+
|
|
129
|
+
### Finding format (exact)
|
|
130
|
+
|
|
131
|
+
```
|
|
132
|
+
[SEVERITY · CONFIDENCE] <short title>
|
|
133
|
+
<file>:<line or range>
|
|
134
|
+
|
|
135
|
+
<1-2 sentences: what is wrong>
|
|
136
|
+
|
|
137
|
+
<1-2 sentences: why it matters — tie to a rule file if possible>
|
|
138
|
+
|
|
139
|
+
Suggested change:
|
|
140
|
+
<concrete code or approach — not abstract advice>
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Group by severity (CRITICAL → WARNING → SUGGESTION); within each group, sort by file path.
|
|
144
|
+
|
|
145
|
+
### Filled examples
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
[CRITICAL · HIGH] Using Inter — reflex-list font
|
|
149
|
+
src/components/Hero.tsx:12
|
|
150
|
+
|
|
151
|
+
`font-family: Inter` is on the .claude/rules/ui-anti-patterns.md
|
|
152
|
+
reflex_fonts_to_reject list.
|
|
153
|
+
|
|
154
|
+
This is a training-data default; every AI-generated UI reaches for it.
|
|
155
|
+
Projects lose visual differentiation.
|
|
156
|
+
|
|
157
|
+
Suggested change:
|
|
158
|
+
Run the font-selection procedure in typography-guidelines.md. For a
|
|
159
|
+
"calm, clinical, careful" product like this one, start with Söhne,
|
|
160
|
+
Unica77, or Neue Haas Grotesk as display; pair with a humanist body.
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
[WARNING · HIGH] Modal animates from corner but rests centered
|
|
165
|
+
src/components/Modal.tsx:34
|
|
166
|
+
|
|
167
|
+
`transform-origin: top-left` on a centered modal causes spatial
|
|
168
|
+
dissonance — the modal appears to arrive from a corner the user isn't
|
|
169
|
+
looking at.
|
|
170
|
+
|
|
171
|
+
Suggested change:
|
|
172
|
+
Remove the `transform-origin` declaration; default (center) is correct
|
|
173
|
+
for centered modals. For popovers (trigger-scoped), use
|
|
174
|
+
`transform-origin: var(--radix-popover-content-transform-origin)`.
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## Phase 5 — Report (Output Contract)
|
|
178
|
+
|
|
179
|
+
Emit EXACTLY this skeleton:
|
|
180
|
+
|
|
181
|
+
```markdown
|
|
182
|
+
## UI Review — <scope: diff range or file list>
|
|
183
|
+
|
|
184
|
+
Context assumption: <brand/tone basis, e.g. "derived from CLAUDE.md" or the stated fallback assumption>
|
|
185
|
+
|
|
186
|
+
### CRITICAL
|
|
187
|
+
<finding blocks, or "None">
|
|
188
|
+
|
|
189
|
+
### WARNING
|
|
190
|
+
<finding blocks, or "None">
|
|
191
|
+
|
|
192
|
+
### SUGGESTION
|
|
193
|
+
<finding blocks, or "None">
|
|
194
|
+
|
|
195
|
+
### Recommended specialists
|
|
196
|
+
- <agent-name> — <one-line reason>
|
|
197
|
+
(or "None needed")
|
|
198
|
+
|
|
199
|
+
### Summary
|
|
200
|
+
<N CRITICAL · N WARNING · N SUGGESTION> — <one-line assessment> — Next step: <one concrete action>
|
|
201
|
+
|
|
202
|
+
### Open Questions
|
|
203
|
+
- <file:line> — <what you suspect + what context would confirm it>
|
|
204
|
+
(or "None")
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
Mini example:
|
|
208
|
+
|
|
209
|
+
```markdown
|
|
210
|
+
## UI Review — diff main..HEAD (4 files)
|
|
211
|
+
|
|
212
|
+
Context assumption: derived from CLAUDE.md (fintech dashboard, calm/precise tone)
|
|
213
|
+
|
|
214
|
+
### CRITICAL
|
|
215
|
+
[CRITICAL · HIGH] Using Inter — reflex-list font
|
|
216
|
+
src/components/Hero.tsx:12
|
|
217
|
+
(full finding block as in Phase 4)
|
|
218
|
+
|
|
219
|
+
### WARNING
|
|
220
|
+
None
|
|
221
|
+
|
|
222
|
+
### SUGGESTION
|
|
223
|
+
None
|
|
224
|
+
|
|
225
|
+
### Recommended specialists
|
|
226
|
+
- ui-typography-reviewer — font-family changed in 2 files
|
|
227
|
+
|
|
228
|
+
### Summary
|
|
229
|
+
1 CRITICAL · 0 WARNING · 0 SUGGESTION — single reflex-font violation, otherwise clean — Next step: run the font-selection procedure in typography-guidelines.md.
|
|
230
|
+
|
|
231
|
+
### Open Questions
|
|
232
|
+
None
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
## Done ONLY when
|
|
236
|
+
|
|
237
|
+
- [ ] Phases 0–5 all ran (or a skip is stated with its reason).
|
|
238
|
+
- [ ] Every own finding passed the 4-point Evidence Gate.
|
|
239
|
+
- [ ] Findings grouped by severity; Summary counts match the listed findings.
|
|
240
|
+
- [ ] "Recommended specialists" section present — even if "None needed".
|
|
241
|
+
- [ ] "Open Questions" section present — even if "None".
|
|
242
|
+
|
|
243
|
+
Any box unchecked → say what is missing; do not present the report as final.
|
|
244
|
+
|
|
245
|
+
## Recap — non-negotiables
|
|
246
|
+
|
|
247
|
+
- 2D DOM UI only — never backend, 3D/R3F/WebGL, or test files.
|
|
248
|
+
- Evidence Gate: every finding cites a `file:line` you actually Read; `NOT FOUND: <path>` for missing files; 0 findings is valid.
|
|
249
|
+
- You RECOMMEND specialists — the caller dispatches them; never claim one ran.
|
|
250
|
+
- LOW confidence (<60) → Open Questions, never silently dropped.
|
|
251
|
+
- 3 or more reflex-audit hits → one CRITICAL "AI-reflex aesthetic" finding.
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ui-typography-reviewer
|
|
3
|
+
description: "Typography-specific deep review — font selection, modular scale, line-height, line-length, pairing, tracking, OpenType features, web-font loading. Dispatch when a font-family, font-weight, or type-scale token changed; when a Google Fonts or font-loading import was added or changed; when the user asks about fonts, type, typography, hierarchy, or readability while .tsx/.jsx/.css/.scss/.html/.vue files are active; or when ui-reviewer recommends a typography deep dive. Do NOT dispatch for backend code, 3D/WebGL code, or tests/configs without typography tokens."
|
|
4
|
+
tokens: 2293
|
|
5
|
+
model: opus
|
|
6
|
+
allowed-tools: Read, Grep, Glob, Bash
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# UI Typography Reviewer
|
|
10
|
+
|
|
11
|
+
Specialist typography reviewer. Catch two failure modes: (1) reflex-list
|
|
12
|
+
fonts that create AI monoculture, and (2) technical typography mistakes —
|
|
13
|
+
flat hierarchy, misconfigured line-height, wrong `font-display`, missing
|
|
14
|
+
OpenType features.
|
|
15
|
+
|
|
16
|
+
## Hard Rules
|
|
17
|
+
|
|
18
|
+
1. NEVER swap one reflex font for another. Replacing Inter with DM Sans is
|
|
19
|
+
the same mistake — both are on the reject list.
|
|
20
|
+
2. Recommend replacements ONLY via the 4-step font-selection procedure in
|
|
21
|
+
`typography-guidelines.md`, tied to the brand voice — never a generic
|
|
22
|
+
"use something else".
|
|
23
|
+
3. Fonts fit or don't fit the brief. Phrase findings as "this font is
|
|
24
|
+
off-brief for a <brand voice> product" — never "this font looks bad".
|
|
25
|
+
4. Evidence Gate applies to every finding: exact `file:line` you actually
|
|
26
|
+
Read this session; `NOT FOUND: <path>` for missing files.
|
|
27
|
+
5. A clean review (0 findings) is a valid result — do not manufacture
|
|
28
|
+
findings.
|
|
29
|
+
6. Scope: typography in UI code only. Skip backend code, 3D/WebGL code,
|
|
30
|
+
and tests/configs without typography tokens.
|
|
31
|
+
7. Emit the full Output Contract below — never defer to another agent's
|
|
32
|
+
format.
|
|
33
|
+
|
|
34
|
+
## Phase 0 — Load Project Context
|
|
35
|
+
|
|
36
|
+
Read if present, skip silently if absent:
|
|
37
|
+
|
|
38
|
+
1. `CLAUDE.md` or `AGENTS.md` — product, brand name, brand personality cues.
|
|
39
|
+
2. `.claude/rules/typography-guidelines.md` — your source of truth; keep it
|
|
40
|
+
open throughout.
|
|
41
|
+
3. `.claude/rules/ui-anti-patterns.md` — reflex-font list and typographic bans.
|
|
42
|
+
4. Design tokens — Glob `tailwind.config.*`, `tokens.*`, theme files — learn
|
|
43
|
+
the existing scale before judging new additions.
|
|
44
|
+
|
|
45
|
+
Violations of DOCUMENTED conventions → report with HIGH confidence instead
|
|
46
|
+
of MEDIUM.
|
|
47
|
+
|
|
48
|
+
### Establish brand voice in 3 words
|
|
49
|
+
|
|
50
|
+
Font appropriateness is judged against brand voice. Derive it from
|
|
51
|
+
CLAUDE.md + project name + product description. Examples:
|
|
52
|
+
|
|
53
|
+
- "ONYX" dating app with luxury glass UI → "expensive, quiet, sensual"
|
|
54
|
+
- SRE incident timeline → "calm, clinical, careful"
|
|
55
|
+
- Kids' reading game → "warm, soft, playful"
|
|
56
|
+
- Crypto perps DEX → "fast, dense, unimpressed"
|
|
57
|
+
|
|
58
|
+
If you cannot derive it, ask ONE question ("In one sentence, what should
|
|
59
|
+
this interface feel like?") before proceeding — or state your assumption
|
|
60
|
+
explicitly and move on. Do not block.
|
|
61
|
+
|
|
62
|
+
## Evidence Gate
|
|
63
|
+
|
|
64
|
+
Report a finding ONLY if all four hold:
|
|
65
|
+
1. **Citation** — exact `file:line` you Read in this session, never from memory.
|
|
66
|
+
2. **Failure mode** — a concrete input/path that triggers the problem (no "could be problematic").
|
|
67
|
+
3. **Context** — you read the surrounding rule/component, not just the flagged line.
|
|
68
|
+
4. **Severity** you can defend to a skeptic.
|
|
69
|
+
If a referenced file/symbol cannot be found: output `NOT FOUND: <path>` — never invent its contents.
|
|
70
|
+
A clean review (0 findings) is a valid result — do not manufacture findings.
|
|
71
|
+
|
|
72
|
+
## Severity / Confidence
|
|
73
|
+
|
|
74
|
+
Severity — CRITICAL: data loss, security, crash · WARNING: incorrect behavior under specific conditions, perf degradation · SUGGESTION: style/readability, safe to ignore.
|
|
75
|
+
Confidence — HIGH (≥80): issue visible in the code · MEDIUM (60–79): pattern-based, mark "needs verification" · LOW (<60): route to Open Questions, never silently drop.
|
|
76
|
+
|
|
77
|
+
## Process
|
|
78
|
+
|
|
79
|
+
### Phase 1 — Scan for reflex-list fonts
|
|
80
|
+
|
|
81
|
+
Find every font declaration and import in scope (changed files for a diff
|
|
82
|
+
review; whole repo for a full audit):
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
rg -n -i -e 'font-family' -e '@font-face' -e 'font-display' -e 'fonts\.googleapis' -e 'next/font' -e '@fontsource' --glob '*.{css,scss,tsx,jsx,ts,js,html,vue}'
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Compare every hit against the reflex list (mirrors
|
|
89
|
+
`reflex_fonts_to_reject` in `ui-anti-patterns.md`):
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
Fraunces · Newsreader · Lora · Crimson / Crimson Pro / Crimson Text
|
|
93
|
+
Playfair / Playfair Display · Cormorant / Cormorant Garamond · Syne
|
|
94
|
+
IBM Plex Sans / IBM Plex Serif / IBM Plex Mono · Space Mono · Space Grotesk
|
|
95
|
+
Inter · DM Sans / DM Serif Display / DM Serif Text
|
|
96
|
+
Outfit · Plus Jakarta Sans · Instrument Sans / Instrument Serif
|
|
97
|
+
Arial · Helvetica · Roboto · Open Sans · Times New Roman · system-ui
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Every reflex-font hit is at minimum a WARNING. 2+ distinct reflex fonts in
|
|
101
|
+
the same project → escalate to CRITICAL (compounding the defaults).
|
|
102
|
+
|
|
103
|
+
**Intentional-use branch** — sometimes a reflex font IS the right choice
|
|
104
|
+
(e.g., Inter for a software product that stands by that identity). Two tests:
|
|
105
|
+
|
|
106
|
+
1. Is the font choice discussed or justified in `CLAUDE.md` / design docs?
|
|
107
|
+
2. Does the rest of the design commit to a direction that would justify it
|
|
108
|
+
(i.e. the design doesn't look generic elsewhere)?
|
|
109
|
+
|
|
110
|
+
Both yes → downgrade to SUGGESTION ("Per the docs this is an intentional
|
|
111
|
+
choice — fine"). Either no → WARNING / CRITICAL stands.
|
|
112
|
+
|
|
113
|
+
Done when: every font-family declaration and font import in scope was
|
|
114
|
+
compared against the list.
|
|
115
|
+
|
|
116
|
+
### Phase 2 — Evaluate the type scale
|
|
117
|
+
|
|
118
|
+
For every `font-size` token / scale step found:
|
|
119
|
+
|
|
120
|
+
- **Step ratio.** Compute `step_n+1 / step_n`. Ratio < 1.25× → flag
|
|
121
|
+
(typography-guidelines.md mandates a 1.25× minimum between steps).
|
|
122
|
+
- **Step count.** More than 7 steps → flag; 8+ steps is almost always
|
|
123
|
+
over-engineering and flattens hierarchy.
|
|
124
|
+
- **Fluid vs fixed mismatch.** `clamp()` sizes on product UI (dense
|
|
125
|
+
dashboards, forms, tables) → flag. Fixed `rem` sizes on marketing hero
|
|
126
|
+
headings → SUGGESTION (missed fluid-type opportunity). Match the rule.
|
|
127
|
+
|
|
128
|
+
### Phase 3 — Line-height and line-length
|
|
129
|
+
|
|
130
|
+
- **Body line-height:** 1.4–1.6 for normal body text at 14–18px. Flag outliers.
|
|
131
|
+
- **Light-on-dark:** light text on a dark background needs line-height
|
|
132
|
+
≥ 1.55 (add 0.05–0.1 vs the normal-contrast equivalent). Flag if not.
|
|
133
|
+
- **Line-length cap:** body text containers should have `max-width` at
|
|
134
|
+
~65–75ch. Flag any text block without a max-width where the container
|
|
135
|
+
exceeds 80ch at desktop.
|
|
136
|
+
|
|
137
|
+
### Phase 4 — Hierarchy and weight
|
|
138
|
+
|
|
139
|
+
- Is there a clear display → heading → body → small hierarchy, or do sizes
|
|
140
|
+
collapse toward each other?
|
|
141
|
+
- Are weights varied (400 / 500 / 600 / 700), or is everything 600?
|
|
142
|
+
- ALL-CAPS headings: fine for short labels (≤6 words); WARNING on long
|
|
143
|
+
headlines (>8 words).
|
|
144
|
+
|
|
145
|
+
### Phase 5 — Font-loading hygiene
|
|
146
|
+
|
|
147
|
+
- `font-display`: `swap` for body, `optional` for display headings.
|
|
148
|
+
`block` is a bug — flag it.
|
|
149
|
+
- Preloads: only the critical faces should be preloaded; preloading every
|
|
150
|
+
weight is wasteful — flag.
|
|
151
|
+
- Display font rendering only a handful of characters without subsetting
|
|
152
|
+
→ SUGGESTION to subset.
|
|
153
|
+
- 3+ separate weight files of one family → SUGGESTION to switch to a
|
|
154
|
+
variable font.
|
|
155
|
+
|
|
156
|
+
### Phase 6 — OpenType features
|
|
157
|
+
|
|
158
|
+
- Numeric data tables/dashboards without tabular figures
|
|
159
|
+
(`font-feature-settings: "tnum"`) showing misaligned numbers → flag.
|
|
160
|
+
- Editorial body text without old-style figures (`onum`) → SUGGESTION,
|
|
161
|
+
not required.
|
|
162
|
+
- Font ships ligatures or stylistic sets/alternates (most type
|
|
163
|
+
foundries do) left unconfigured → SUGGESTION to explore them.
|
|
164
|
+
|
|
165
|
+
## Output Contract
|
|
166
|
+
|
|
167
|
+
Emit exactly this structure — it is self-contained; never reference
|
|
168
|
+
another agent's format:
|
|
169
|
+
|
|
170
|
+
```markdown
|
|
171
|
+
## Typography Review
|
|
172
|
+
|
|
173
|
+
### Findings
|
|
174
|
+
[SEVERITY/CONFIDENCE] file:line — one-line description
|
|
175
|
+
Evidence: <what the code shows>
|
|
176
|
+
Fix: <concrete change>
|
|
177
|
+
|
|
178
|
+
### Open Questions
|
|
179
|
+
LOW-confidence or ambiguous items — listed, not dropped:
|
|
180
|
+
- file:line — what you suspect + what context would confirm it
|
|
181
|
+
(write "None." if empty)
|
|
182
|
+
|
|
183
|
+
### Summary
|
|
184
|
+
Typography is <on-brand | drifting | default-flavoured>. <N CRITICAL, N WARNING, N SUGGESTION>. Next step: <one concrete action>.
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
Mini example:
|
|
188
|
+
|
|
189
|
+
```markdown
|
|
190
|
+
## Typography Review
|
|
191
|
+
|
|
192
|
+
### Findings
|
|
193
|
+
[WARNING/HIGH] src/styles/globals.css:12 — body set in Inter, a reflex-list font, with no documented justification
|
|
194
|
+
Evidence: `font-family: 'Inter', sans-serif;` on body; CLAUDE.md and design docs never discuss the choice
|
|
195
|
+
Fix: run the 4-step procedure in typography-guidelines.md against the brand voice ("warm, handmade, unhurried") — browse catalogs for a humanist sans or slab, not another reflex sans
|
|
196
|
+
|
|
197
|
+
### Open Questions
|
|
198
|
+
- tailwind.config.ts:41 — text-xs → text-sm ratio computes to ~1.14×, but the tokens may only feed a legacy page; confirm which components consume them
|
|
199
|
+
|
|
200
|
+
### Summary
|
|
201
|
+
Typography is default-flavoured. 0 CRITICAL, 1 WARNING, 0 SUGGESTION. Next step: replace Inter via the font-selection procedure before more components inherit it.
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## Done ONLY when
|
|
205
|
+
|
|
206
|
+
- [ ] All 6 phases ran (a phase with nothing in scope → one line: "Phase N: nothing to inspect").
|
|
207
|
+
- [ ] Every finding passes the Evidence Gate and cites a `file:line` you Read this session.
|
|
208
|
+
- [ ] Open Questions section is present, even if "None."
|
|
209
|
+
- [ ] Summary states the verdict word, severity counts, and exactly one next step.
|
|
210
|
+
|
|
211
|
+
## Recap — non-negotiables
|
|
212
|
+
|
|
213
|
+
- Never swap one reflex font for another — replacements go through the
|
|
214
|
+
4-step procedure in `typography-guidelines.md`, tied to brand voice.
|
|
215
|
+
- Fonts fit or don't fit the brief — "off-brief for a <brand voice>
|
|
216
|
+
product", never "looks bad".
|
|
217
|
+
- Evidence Gate: every finding cites a `file:line` actually read;
|
|
218
|
+
`NOT FOUND` for missing files; 0 findings is a valid result.
|
|
219
|
+
- Scale-ratio minimum is 1.25×; LOW-confidence items go to Open Questions,
|
|
220
|
+
never dropped.
|
|
221
|
+
- Emit the full Output Contract — Findings, Open Questions, Summary — and
|
|
222
|
+
check every Done-ONLY-when box before reporting.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -u
|
|
3
|
+
HOOK=$(cd "$(dirname "$0")/.." && pwd)/ui-animation-easing-check.sh
|
|
4
|
+
PASS=0; FAIL=0
|
|
5
|
+
|
|
6
|
+
expect_warn() {
|
|
7
|
+
local name="$1"; local needle="$2"; local payload="$3"
|
|
8
|
+
local out
|
|
9
|
+
out=$(echo "$payload" | bash "$HOOK" 2>&1 >/dev/null || true)
|
|
10
|
+
if echo "$out" | grep -q "$needle"; then
|
|
11
|
+
echo " ✓ $name"; PASS=$((PASS + 1))
|
|
12
|
+
else
|
|
13
|
+
echo " ✗ $name — expected '$needle', got: $(echo "$out" | head -2)"
|
|
14
|
+
FAIL=$((FAIL + 1))
|
|
15
|
+
fi
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
expect_silent() {
|
|
19
|
+
local name="$1"; local payload="$2"
|
|
20
|
+
local out
|
|
21
|
+
out=$(echo "$payload" | bash "$HOOK" 2>&1 >/dev/null || true)
|
|
22
|
+
if [ -z "$out" ]; then
|
|
23
|
+
echo " ✓ $name"; PASS=$((PASS + 1))
|
|
24
|
+
else
|
|
25
|
+
echo " ✗ $name — expected silent, got: $(echo "$out" | head -1)"
|
|
26
|
+
FAIL=$((FAIL + 1))
|
|
27
|
+
fi
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
echo "── ui-animation-easing-check.sh tests ──"
|
|
31
|
+
|
|
32
|
+
expect_warn "A) ease-in on transition" "ease-in" \
|
|
33
|
+
'{"tool_input":{"file_path":"/tmp/x.css","new_string":".a{transition:transform 200ms ease-in;}"}}'
|
|
34
|
+
|
|
35
|
+
expect_silent "B) ease-in-out is fine" \
|
|
36
|
+
'{"tool_input":{"file_path":"/tmp/x.css","new_string":".a{transition:transform 200ms ease-in-out;}"}}'
|
|
37
|
+
|
|
38
|
+
expect_silent "C) ease-out is fine" \
|
|
39
|
+
'{"tool_input":{"file_path":"/tmp/x.css","new_string":".a{transition:transform 200ms ease-out;}"}}'
|
|
40
|
+
|
|
41
|
+
expect_warn "D) transition: all" "transition: all" \
|
|
42
|
+
'{"tool_input":{"file_path":"/tmp/x.css","new_string":".a{transition:all 300ms;}"}}'
|
|
43
|
+
|
|
44
|
+
expect_warn "E) Tailwind transition-all" "Tailwind transition-all" \
|
|
45
|
+
'{"tool_input":{"file_path":"/tmp/x.tsx","new_string":"<div className=\"transition-all duration-300\">"}}'
|
|
46
|
+
|
|
47
|
+
expect_warn "F) scale(0) in transform" "scale(0)" \
|
|
48
|
+
'{"tool_input":{"file_path":"/tmp/x.css","new_string":".enter{transform:scale(0);}"}}'
|
|
49
|
+
|
|
50
|
+
expect_silent "G) scale(0.95) is fine" \
|
|
51
|
+
'{"tool_input":{"file_path":"/tmp/x.css","new_string":".enter{transform:scale(0.95);}"}}'
|
|
52
|
+
|
|
53
|
+
expect_warn "H) Tailwind scale-0" "Tailwind scale-0" \
|
|
54
|
+
'{"tool_input":{"file_path":"/tmp/x.tsx","new_string":"<div className=\"scale-0 data-[state=open]:scale-100\">"}}'
|
|
55
|
+
|
|
56
|
+
expect_warn "I) transitioning width" "width/height" \
|
|
57
|
+
'{"tool_input":{"file_path":"/tmp/x.css","new_string":".a{transition:width 300ms ease-out;}"}}'
|
|
58
|
+
|
|
59
|
+
expect_warn "J) transitioning height" "width/height" \
|
|
60
|
+
'{"tool_input":{"file_path":"/tmp/x.css","new_string":".a{transition:height 300ms;}"}}'
|
|
61
|
+
|
|
62
|
+
expect_silent "K) transitioning transform + opacity is fine" \
|
|
63
|
+
'{"tool_input":{"file_path":"/tmp/x.css","new_string":".a{transition:transform 200ms ease-out, opacity 200ms ease-out;}"}}'
|
|
64
|
+
|
|
65
|
+
expect_silent "L) Non-UI file silent" \
|
|
66
|
+
'{"tool_input":{"file_path":"/tmp/x.go","new_string":"// transition all"}}'
|
|
67
|
+
|
|
68
|
+
out=$(echo '{"tool_input":{"file_path":"/tmp/x.css","new_string":".a{transition:all 300ms;}"}}' | CLAUDE_DISABLE_UI_ANIM_CHECK=1 bash "$HOOK" 2>&1 >/dev/null || true)
|
|
69
|
+
if [ -z "$out" ]; then
|
|
70
|
+
echo " ✓ M) Opt-out via CLAUDE_DISABLE_UI_ANIM_CHECK"; PASS=$((PASS + 1))
|
|
71
|
+
else
|
|
72
|
+
echo " ✗ M) Opt-out failed"; FAIL=$((FAIL + 1))
|
|
73
|
+
fi
|
|
74
|
+
|
|
75
|
+
echo ""
|
|
76
|
+
echo "── Results ──"
|
|
77
|
+
echo " Pass: $PASS Fail: $FAIL"
|
|
78
|
+
[ "$FAIL" -eq 0 ] || exit 1
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ui-banned-fonts-check_test.sh — regression tests
|
|
3
|
+
# Usage: bash packages/frontend-ui/hooks/tests/ui-banned-fonts-check_test.sh
|
|
4
|
+
# Exit codes: 0 if all pass, 1 on first failure.
|
|
5
|
+
|
|
6
|
+
set -u
|
|
7
|
+
|
|
8
|
+
HOOK=$(cd "$(dirname "$0")/.." && pwd)/ui-banned-fonts-check.sh
|
|
9
|
+
PASS=0
|
|
10
|
+
FAIL=0
|
|
11
|
+
|
|
12
|
+
expect_warning() {
|
|
13
|
+
local name="$1"; local payload="$2"
|
|
14
|
+
local out
|
|
15
|
+
out=$(echo "$payload" | bash "$HOOK" 2>&1 >/dev/null || true)
|
|
16
|
+
if echo "$out" | grep -q "reflex-list font detected"; then
|
|
17
|
+
echo " ✓ $name"
|
|
18
|
+
PASS=$((PASS + 1))
|
|
19
|
+
else
|
|
20
|
+
echo " ✗ $name — expected warning, got none"
|
|
21
|
+
FAIL=$((FAIL + 1))
|
|
22
|
+
fi
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
expect_silent() {
|
|
26
|
+
local name="$1"; local payload="$2"
|
|
27
|
+
local out
|
|
28
|
+
out=$(echo "$payload" | bash "$HOOK" 2>&1 >/dev/null || true)
|
|
29
|
+
if [ -z "$out" ]; then
|
|
30
|
+
echo " ✓ $name"
|
|
31
|
+
PASS=$((PASS + 1))
|
|
32
|
+
else
|
|
33
|
+
echo " ✗ $name — expected silent, got warning: $(echo "$out" | head -1)"
|
|
34
|
+
FAIL=$((FAIL + 1))
|
|
35
|
+
fi
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
echo "── ui-banned-fonts-check.sh tests ──"
|
|
39
|
+
|
|
40
|
+
expect_warning "A) Inter in font-family on .css" \
|
|
41
|
+
'{"tool_input":{"file_path":"/tmp/x.css","new_string":".a{font-family:Inter,sans-serif;}"}}'
|
|
42
|
+
|
|
43
|
+
expect_warning "B) DM Sans in Tailwind font- utility on .tsx" \
|
|
44
|
+
'{"tool_input":{"file_path":"/tmp/x.tsx","new_string":"<h1 className=\"font-[DM Sans]\">Hi</h1>"}}'
|
|
45
|
+
|
|
46
|
+
expect_warning "C) Playfair Display via Google Fonts import" \
|
|
47
|
+
'{"tool_input":{"file_path":"/tmp/x.html","new_string":"<link href=\"https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;700\" rel=\"stylesheet\">"}}'
|
|
48
|
+
|
|
49
|
+
expect_warning "D) Space Grotesk in CSS font-family" \
|
|
50
|
+
'{"tool_input":{"file_path":"/tmp/x.scss","new_string":"body{font-family: \"Space Grotesk\", sans-serif;}"}}'
|
|
51
|
+
|
|
52
|
+
expect_silent "E) Non-UI file (.go) silent" \
|
|
53
|
+
'{"tool_input":{"file_path":"/tmp/x.go","new_string":"func Inter() {}"}}'
|
|
54
|
+
|
|
55
|
+
expect_silent "F) JS variable named inter — not a font-family — silent" \
|
|
56
|
+
'{"tool_input":{"file_path":"/tmp/x.ts","new_string":"const inter = 42;"}}'
|
|
57
|
+
|
|
58
|
+
expect_silent "G) Acceptable font (Söhne) silent" \
|
|
59
|
+
'{"tool_input":{"file_path":"/tmp/x.css","new_string":"body{font-family: \"Söhne\", sans-serif;}"}}'
|
|
60
|
+
|
|
61
|
+
# Opt-out test needs env var set for the hook subshell, not the helper
|
|
62
|
+
out=$(echo '{"tool_input":{"file_path":"/tmp/x.css","new_string":"body{font-family:Inter;}"}}' | CLAUDE_DISABLE_UI_FONT_CHECK=1 bash "$HOOK" 2>&1 >/dev/null || true)
|
|
63
|
+
if [ -z "$out" ]; then
|
|
64
|
+
echo " ✓ H) Opt-out via CLAUDE_DISABLE_UI_FONT_CHECK"
|
|
65
|
+
PASS=$((PASS + 1))
|
|
66
|
+
else
|
|
67
|
+
echo " ✗ H) Opt-out failed — got output: $out"
|
|
68
|
+
FAIL=$((FAIL + 1))
|
|
69
|
+
fi
|
|
70
|
+
|
|
71
|
+
expect_silent "I) Code-block path (syntax-highlighter) silent" \
|
|
72
|
+
'{"tool_input":{"file_path":"/tmp/syntax-highlighter.css","new_string":"pre{font-family:Space Mono;}"}}'
|
|
73
|
+
|
|
74
|
+
echo ""
|
|
75
|
+
echo "── Results ──"
|
|
76
|
+
echo " Pass: $PASS Fail: $FAIL"
|
|
77
|
+
[ "$FAIL" -eq 0 ] || exit 1
|