quiver-cli 1.3.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +197 -239
- package/dist/cli.js +3163 -2040
- package/package.json +10 -11
- package/template/.agents/AGENTS.md +0 -26
- package/template/.agents/commands/cp.md +0 -108
- package/template/.agents/commands/next-setup.md +0 -1064
- package/template/.agents/commands/review.md +0 -68
- package/template/.agents/commands/terraform-readme.md +0 -38
- package/template/.agents/config.json +0 -80
- package/template/.agents/plugins/opencode/rtk.ts +0 -34
- package/template/.agents/skills/agent-browser/SKILL.md +0 -51
- package/template/.agents/skills/apps/skybridge/SKILL.md +0 -50
- package/template/.agents/skills/code/cleanup/SKILL.md +0 -26
- package/template/.agents/skills/code/improve/SKILL.md +0 -122
- package/template/.agents/skills/code/improve/references/audit-playbook.md +0 -130
- package/template/.agents/skills/code/improve/references/closing-the-loop.md +0 -96
- package/template/.agents/skills/code/improve/references/plan-template.md +0 -197
- package/template/.agents/skills/code/vercel-react-best-practices/AGENTS.md +0 -3810
- package/template/.agents/skills/code/vercel-react-best-practices/README.md +0 -123
- package/template/.agents/skills/code/vercel-react-best-practices/SKILL.md +0 -149
- package/template/.agents/skills/code/vercel-react-best-practices/metadata.json +0 -15
- package/template/.agents/skills/code/vercel-react-best-practices/rules/_sections.md +0 -46
- package/template/.agents/skills/code/vercel-react-best-practices/rules/_template.md +0 -28
- package/template/.agents/skills/code/vercel-react-best-practices/rules/advanced-effect-event-deps.md +0 -56
- package/template/.agents/skills/code/vercel-react-best-practices/rules/advanced-event-handler-refs.md +0 -55
- package/template/.agents/skills/code/vercel-react-best-practices/rules/advanced-init-once.md +0 -42
- package/template/.agents/skills/code/vercel-react-best-practices/rules/advanced-use-latest.md +0 -39
- package/template/.agents/skills/code/vercel-react-best-practices/rules/async-api-routes.md +0 -38
- package/template/.agents/skills/code/vercel-react-best-practices/rules/async-cheap-condition-before-await.md +0 -37
- package/template/.agents/skills/code/vercel-react-best-practices/rules/async-defer-await.md +0 -82
- package/template/.agents/skills/code/vercel-react-best-practices/rules/async-dependencies.md +0 -51
- package/template/.agents/skills/code/vercel-react-best-practices/rules/async-parallel.md +0 -28
- package/template/.agents/skills/code/vercel-react-best-practices/rules/async-suspense-boundaries.md +0 -99
- package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-analyzable-paths.md +0 -63
- package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-barrel-imports.md +0 -60
- package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-conditional.md +0 -31
- package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-defer-third-party.md +0 -49
- package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-dynamic-imports.md +0 -35
- package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-preload.md +0 -50
- package/template/.agents/skills/code/vercel-react-best-practices/rules/client-event-listeners.md +0 -74
- package/template/.agents/skills/code/vercel-react-best-practices/rules/client-localstorage-schema.md +0 -71
- package/template/.agents/skills/code/vercel-react-best-practices/rules/client-passive-event-listeners.md +0 -48
- package/template/.agents/skills/code/vercel-react-best-practices/rules/client-swr-dedup.md +0 -56
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-batch-dom-css.md +0 -107
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-cache-function-results.md +0 -80
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-cache-property-access.md +0 -28
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-cache-storage.md +0 -70
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-combine-iterations.md +0 -32
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-early-exit.md +0 -50
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-flatmap-filter.md +0 -60
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-hoist-regexp.md +0 -45
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-index-maps.md +0 -37
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-length-check-first.md +0 -49
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-min-max-loop.md +0 -82
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-request-idle-callback.md +0 -105
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-set-map-lookups.md +0 -24
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-tosorted-immutable.md +0 -57
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-activity.md +0 -26
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-conditional-render.md +0 -40
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-content-visibility.md +0 -38
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-hoist-jsx.md +0 -46
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +0 -30
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-resource-hints.md +0 -85
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-script-defer-async.md +0 -68
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-svg-precision.md +0 -28
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-usetransition-loading.md +0 -75
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-defer-reads.md +0 -39
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-dependencies.md +0 -45
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +0 -40
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-derived-state.md +0 -29
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-functional-setstate.md +0 -74
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-lazy-state-init.md +0 -58
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +0 -38
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-memo.md +0 -44
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +0 -45
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-no-inline-components.md +0 -82
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -35
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +0 -64
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-transitions.md +0 -40
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-use-deferred-value.md +0 -59
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +0 -73
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-after-nonblocking.md +0 -73
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-auth-actions.md +0 -96
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-cache-lru.md +0 -41
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-cache-react.md +0 -76
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-dedup-props.md +0 -65
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-hoist-static-io.md +0 -149
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-no-shared-module-state.md +0 -50
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-parallel-fetching.md +0 -83
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-parallel-nested-fetching.md +0 -34
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-serialization.md +0 -38
- package/template/.agents/skills/data/prisma-cli/SKILL.md +0 -247
- package/template/.agents/skills/data/prisma-cli/references/db-execute.md +0 -78
- package/template/.agents/skills/data/prisma-cli/references/db-pull.md +0 -185
- package/template/.agents/skills/data/prisma-cli/references/db-push.md +0 -148
- package/template/.agents/skills/data/prisma-cli/references/db-seed.md +0 -188
- package/template/.agents/skills/data/prisma-cli/references/debug.md +0 -46
- package/template/.agents/skills/data/prisma-cli/references/dev.md +0 -157
- package/template/.agents/skills/data/prisma-cli/references/format.md +0 -48
- package/template/.agents/skills/data/prisma-cli/references/generate.md +0 -173
- package/template/.agents/skills/data/prisma-cli/references/init.md +0 -136
- package/template/.agents/skills/data/prisma-cli/references/mcp.md +0 -38
- package/template/.agents/skills/data/prisma-cli/references/migrate-deploy.md +0 -127
- package/template/.agents/skills/data/prisma-cli/references/migrate-dev.md +0 -145
- package/template/.agents/skills/data/prisma-cli/references/migrate-diff.md +0 -89
- package/template/.agents/skills/data/prisma-cli/references/migrate-reset.md +0 -78
- package/template/.agents/skills/data/prisma-cli/references/migrate-resolve.md +0 -57
- package/template/.agents/skills/data/prisma-cli/references/migrate-status.md +0 -65
- package/template/.agents/skills/data/prisma-cli/references/studio.md +0 -137
- package/template/.agents/skills/data/prisma-cli/references/validate.md +0 -53
- package/template/.agents/skills/data/prisma-client-api/SKILL.md +0 -216
- package/template/.agents/skills/data/prisma-client-api/references/client-methods.md +0 -223
- package/template/.agents/skills/data/prisma-client-api/references/constructor.md +0 -208
- package/template/.agents/skills/data/prisma-client-api/references/filters.md +0 -256
- package/template/.agents/skills/data/prisma-client-api/references/model-queries.md +0 -281
- package/template/.agents/skills/data/prisma-client-api/references/query-options.md +0 -276
- package/template/.agents/skills/data/prisma-client-api/references/raw-queries.md +0 -194
- package/template/.agents/skills/data/prisma-client-api/references/relations.md +0 -308
- package/template/.agents/skills/data/prisma-client-api/references/transactions.md +0 -184
- package/template/.agents/skills/design/impeccable/SKILL.md +0 -84
- package/template/.agents/skills/design/impeccable/reference/adapt.md +0 -312
- package/template/.agents/skills/design/impeccable/reference/adapt.native.md +0 -58
- package/template/.agents/skills/design/impeccable/reference/android.md +0 -40
- package/template/.agents/skills/design/impeccable/reference/animate.md +0 -86
- package/template/.agents/skills/design/impeccable/reference/audit.md +0 -136
- package/template/.agents/skills/design/impeccable/reference/audit.native.md +0 -139
- package/template/.agents/skills/design/impeccable/reference/bolder.md +0 -31
- package/template/.agents/skills/design/impeccable/reference/clarify.md +0 -94
- package/template/.agents/skills/design/impeccable/reference/colorize.md +0 -86
- package/template/.agents/skills/design/impeccable/reference/craft-floor.md +0 -42
- package/template/.agents/skills/design/impeccable/reference/craft.md +0 -5
- package/template/.agents/skills/design/impeccable/reference/critique.md +0 -788
- package/template/.agents/skills/design/impeccable/reference/degraded/asset-producer.md +0 -90
- package/template/.agents/skills/design/impeccable/reference/degraded/documenter.md +0 -24
- package/template/.agents/skills/design/impeccable/reference/degraded/finish-reviewer.md +0 -37
- package/template/.agents/skills/design/impeccable/reference/degraded/manual-edit-applier.md +0 -92
- package/template/.agents/skills/design/impeccable/reference/delight.md +0 -70
- package/template/.agents/skills/design/impeccable/reference/distill.md +0 -111
- package/template/.agents/skills/design/impeccable/reference/doctor.md +0 -53
- package/template/.agents/skills/design/impeccable/reference/document.md +0 -416
- package/template/.agents/skills/design/impeccable/reference/extract.md +0 -69
- package/template/.agents/skills/design/impeccable/reference/harden.md +0 -336
- package/template/.agents/skills/design/impeccable/reference/hooks.md +0 -105
- package/template/.agents/skills/design/impeccable/reference/init.md +0 -125
- package/template/.agents/skills/design/impeccable/reference/ios.md +0 -45
- package/template/.agents/skills/design/impeccable/reference/layout.md +0 -84
- package/template/.agents/skills/design/impeccable/reference/live-setup.md +0 -102
- package/template/.agents/skills/design/impeccable/reference/live.md +0 -323
- package/template/.agents/skills/design/impeccable/reference/new-work.md +0 -105
- package/template/.agents/skills/design/impeccable/reference/onboard.md +0 -234
- package/template/.agents/skills/design/impeccable/reference/operate.md +0 -61
- package/template/.agents/skills/design/impeccable/reference/optimize.md +0 -258
- package/template/.agents/skills/design/impeccable/reference/overdrive.md +0 -127
- package/template/.agents/skills/design/impeccable/reference/polish.md +0 -97
- package/template/.agents/skills/design/impeccable/reference/quieter.md +0 -99
- package/template/.agents/skills/design/impeccable/reference/routing.md +0 -18
- package/template/.agents/skills/design/impeccable/reference/shape.md +0 -59
- package/template/.agents/skills/design/impeccable/reference/typeset.md +0 -80
- package/template/.agents/skills/design/impeccable/reference/visualize.md +0 -47
- package/template/.agents/skills/design/impeccable/scripts/command-metadata.json +0 -94
- package/template/.agents/skills/design/impeccable/scripts/concept-seed.mjs +0 -558
- package/template/.agents/skills/design/impeccable/scripts/context-signals.mjs +0 -334
- package/template/.agents/skills/design/impeccable/scripts/context.mjs +0 -1450
- package/template/.agents/skills/design/impeccable/scripts/critique-storage.mjs +0 -213
- package/template/.agents/skills/design/impeccable/scripts/detect-csp.mjs +0 -198
- package/template/.agents/skills/design/impeccable/scripts/detect.mjs +0 -21
- package/template/.agents/skills/design/impeccable/scripts/detector/browser/injected/index.mjs +0 -2023
- package/template/.agents/skills/design/impeccable/scripts/detector/cli/main.mjs +0 -438
- package/template/.agents/skills/design/impeccable/scripts/detector/design-system.mjs +0 -983
- package/template/.agents/skills/design/impeccable/scripts/detector/detect-antipatterns-browser.js +0 -8283
- package/template/.agents/skills/design/impeccable/scripts/detector/detect-antipatterns.mjs +0 -50
- package/template/.agents/skills/design/impeccable/scripts/detector/engines/browser/detect-url.mjs +0 -372
- package/template/.agents/skills/design/impeccable/scripts/detector/engines/regex/detect-text.mjs +0 -768
- package/template/.agents/skills/design/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +0 -1186
- package/template/.agents/skills/design/impeccable/scripts/detector/engines/static-html/detect-html.mjs +0 -264
- package/template/.agents/skills/design/impeccable/scripts/detector/engines/visual/screenshot-contrast.mjs +0 -189
- package/template/.agents/skills/design/impeccable/scripts/detector/findings.mjs +0 -18
- package/template/.agents/skills/design/impeccable/scripts/detector/node/file-system.mjs +0 -212
- package/template/.agents/skills/design/impeccable/scripts/detector/profile/profiler.mjs +0 -166
- package/template/.agents/skills/design/impeccable/scripts/detector/registry/antipatterns.mjs +0 -617
- package/template/.agents/skills/design/impeccable/scripts/detector/rules/checks.mjs +0 -5580
- package/template/.agents/skills/design/impeccable/scripts/detector/shared/color.mjs +0 -124
- package/template/.agents/skills/design/impeccable/scripts/detector/shared/constants.mjs +0 -112
- package/template/.agents/skills/design/impeccable/scripts/detector/shared/fonts.mjs +0 -30
- package/template/.agents/skills/design/impeccable/scripts/detector/shared/inline-ignores.mjs +0 -148
- package/template/.agents/skills/design/impeccable/scripts/detector/shared/page.mjs +0 -7
- package/template/.agents/skills/design/impeccable/scripts/doctor.mjs +0 -336
- package/template/.agents/skills/design/impeccable/scripts/embed-prompt.mjs +0 -133
- package/template/.agents/skills/design/impeccable/scripts/generate-image.mjs +0 -240
- package/template/.agents/skills/design/impeccable/scripts/hook-admin.mjs +0 -741
- package/template/.agents/skills/design/impeccable/scripts/hook-before-edit.mjs +0 -516
- package/template/.agents/skills/design/impeccable/scripts/hook-lib.mjs +0 -2100
- package/template/.agents/skills/design/impeccable/scripts/hook.mjs +0 -78
- package/template/.agents/skills/design/impeccable/scripts/lib/artifact-schema.mjs +0 -93
- package/template/.agents/skills/design/impeccable/scripts/lib/composition-catalog.mjs +0 -200
- package/template/.agents/skills/design/impeccable/scripts/lib/concept-catalog.mjs +0 -357
- package/template/.agents/skills/design/impeccable/scripts/lib/design-parser.mjs +0 -842
- package/template/.agents/skills/design/impeccable/scripts/lib/impeccable-config.mjs +0 -658
- package/template/.agents/skills/design/impeccable/scripts/lib/impeccable-paths.mjs +0 -137
- package/template/.agents/skills/design/impeccable/scripts/lib/is-generated.mjs +0 -69
- package/template/.agents/skills/design/impeccable/scripts/lib/provider.mjs +0 -5
- package/template/.agents/skills/design/impeccable/scripts/lib/roll-selection.mjs +0 -362
- package/template/.agents/skills/design/impeccable/scripts/lib/staleness-deep.mjs +0 -457
- package/template/.agents/skills/design/impeccable/scripts/lib/staleness-notice.mjs +0 -169
- package/template/.agents/skills/design/impeccable/scripts/lib/staleness.mjs +0 -457
- package/template/.agents/skills/design/impeccable/scripts/lib/surface-briefs.mjs +0 -151
- package/template/.agents/skills/design/impeccable/scripts/lib/target-args.mjs +0 -42
- package/template/.agents/skills/design/impeccable/scripts/lib/target-slug.mjs +0 -33
- package/template/.agents/skills/design/impeccable/scripts/lib/template-extensions.mjs +0 -146
- package/template/.agents/skills/design/impeccable/scripts/live/accept-css.mjs +0 -617
- package/template/.agents/skills/design/impeccable/scripts/live/accept-verify.mjs +0 -60
- package/template/.agents/skills/design/impeccable/scripts/live/browser-script-parts.mjs +0 -55
- package/template/.agents/skills/design/impeccable/scripts/live/completion.mjs +0 -28
- package/template/.agents/skills/design/impeccable/scripts/live/event-validation.mjs +0 -199
- package/template/.agents/skills/design/impeccable/scripts/live/frameworks/astro.mjs +0 -47
- package/template/.agents/skills/design/impeccable/scripts/live/frameworks/detect-utils.mjs +0 -73
- package/template/.agents/skills/design/impeccable/scripts/live/frameworks/index.mjs +0 -143
- package/template/.agents/skills/design/impeccable/scripts/live/frameworks/journal.mjs +0 -197
- package/template/.agents/skills/design/impeccable/scripts/live/frameworks/nextjs.mjs +0 -49
- package/template/.agents/skills/design/impeccable/scripts/live/frameworks/nuxt.mjs +0 -161
- package/template/.agents/skills/design/impeccable/scripts/live/frameworks/script-src.mjs +0 -17
- package/template/.agents/skills/design/impeccable/scripts/live/frameworks/static-html.mjs +0 -26
- package/template/.agents/skills/design/impeccable/scripts/live/frameworks/sveltekit.mjs +0 -71
- package/template/.agents/skills/design/impeccable/scripts/live/frameworks/tag-strategy.mjs +0 -247
- package/template/.agents/skills/design/impeccable/scripts/live/frameworks/tanstack-start.mjs +0 -70
- package/template/.agents/skills/design/impeccable/scripts/live/frameworks/vite-generic.mjs +0 -42
- package/template/.agents/skills/design/impeccable/scripts/live/generation-preflight.mjs +0 -149
- package/template/.agents/skills/design/impeccable/scripts/live/insert-ui.mjs +0 -458
- package/template/.agents/skills/design/impeccable/scripts/live/instructions.mjs +0 -142
- package/template/.agents/skills/design/impeccable/scripts/live/manual-apply.mjs +0 -939
- package/template/.agents/skills/design/impeccable/scripts/live/manual-edit-routes.mjs +0 -357
- package/template/.agents/skills/design/impeccable/scripts/live/manual-edits-buffer.mjs +0 -152
- package/template/.agents/skills/design/impeccable/scripts/live/poll-lanes.mjs +0 -14
- package/template/.agents/skills/design/impeccable/scripts/live/roots.mjs +0 -508
- package/template/.agents/skills/design/impeccable/scripts/live/session-store.mjs +0 -563
- package/template/.agents/skills/design/impeccable/scripts/live/source-lock.mjs +0 -105
- package/template/.agents/skills/design/impeccable/scripts/live/source-search.mjs +0 -105
- package/template/.agents/skills/design/impeccable/scripts/live/svelte-ast.mjs +0 -961
- package/template/.agents/skills/design/impeccable/scripts/live/svelte-component.mjs +0 -1342
- package/template/.agents/skills/design/impeccable/scripts/live/sveltekit-adapter.mjs +0 -316
- package/template/.agents/skills/design/impeccable/scripts/live/tanstack-adapter.mjs +0 -280
- package/template/.agents/skills/design/impeccable/scripts/live/ui-core.mjs +0 -180
- package/template/.agents/skills/design/impeccable/scripts/live/vocabulary.mjs +0 -171
- package/template/.agents/skills/design/impeccable/scripts/live-accept.mjs +0 -954
- package/template/.agents/skills/design/impeccable/scripts/live-browser-dom.js +0 -146
- package/template/.agents/skills/design/impeccable/scripts/live-browser-session.js +0 -123
- package/template/.agents/skills/design/impeccable/scripts/live-browser.js +0 -12512
- package/template/.agents/skills/design/impeccable/scripts/live-commit-manual-edits.mjs +0 -1244
- package/template/.agents/skills/design/impeccable/scripts/live-complete.mjs +0 -107
- package/template/.agents/skills/design/impeccable/scripts/live-copy-edit-agent.mjs +0 -683
- package/template/.agents/skills/design/impeccable/scripts/live-discard-manual-edits.mjs +0 -51
- package/template/.agents/skills/design/impeccable/scripts/live-inject.mjs +0 -503
- package/template/.agents/skills/design/impeccable/scripts/live-insert.mjs +0 -292
- package/template/.agents/skills/design/impeccable/scripts/live-manual-edit-evidence.mjs +0 -368
- package/template/.agents/skills/design/impeccable/scripts/live-poll.mjs +0 -429
- package/template/.agents/skills/design/impeccable/scripts/live-resume.mjs +0 -123
- package/template/.agents/skills/design/impeccable/scripts/live-server.mjs +0 -1661
- package/template/.agents/skills/design/impeccable/scripts/live-status.mjs +0 -71
- package/template/.agents/skills/design/impeccable/scripts/live-target.mjs +0 -30
- package/template/.agents/skills/design/impeccable/scripts/live-wrap.mjs +0 -927
- package/template/.agents/skills/design/impeccable/scripts/live.mjs +0 -359
- package/template/.agents/skills/design/impeccable/scripts/modern-screenshot.umd.js +0 -14
- package/template/.agents/skills/design/impeccable/scripts/palette.mjs +0 -628
- package/template/.agents/skills/design/impeccable/scripts/pin.mjs +0 -221
- package/template/.agents/skills/design/impeccable/scripts/serve-question.mjs +0 -932
- package/template/.agents/skills/design/impeccable/scripts/surface-brief.mjs +0 -74
- package/template/.agents/skills/design/shadcn/SKILL.md +0 -277
- package/template/.agents/skills/design/shadcn/agents/openai.yml +0 -5
- package/template/.agents/skills/design/shadcn/assets/shadcn-small.png +0 -0
- package/template/.agents/skills/design/shadcn/assets/shadcn.png +0 -0
- package/template/.agents/skills/design/shadcn/cli.md +0 -290
- package/template/.agents/skills/design/shadcn/customization.md +0 -209
- package/template/.agents/skills/design/shadcn/evals/evals.json +0 -77
- package/template/.agents/skills/design/shadcn/mcp.md +0 -105
- package/template/.agents/skills/design/shadcn/registry.md +0 -277
- package/template/.agents/skills/design/shadcn/rules/base-vs-radix.md +0 -306
- package/template/.agents/skills/design/shadcn/rules/chat.md +0 -224
- package/template/.agents/skills/design/shadcn/rules/composition.md +0 -213
- package/template/.agents/skills/design/shadcn/rules/forms.md +0 -192
- package/template/.agents/skills/design/shadcn/rules/icons.md +0 -101
- package/template/.agents/skills/design/shadcn/rules/styling.md +0 -185
- package/template/.agents/skills/find-skills/SKILL.md +0 -141
- package/template/.agents/skills/hono/SKILL.md +0 -579
- package/template/.agents/skills/integrations/langfuse/SKILL.md +0 -146
- package/template/.agents/skills/integrations/langfuse/references/ci-cd.md +0 -41
- package/template/.agents/skills/integrations/langfuse/references/cli.md +0 -60
- package/template/.agents/skills/integrations/langfuse/references/error-analysis.md +0 -88
- package/template/.agents/skills/integrations/langfuse/references/instrumentation.md +0 -121
- package/template/.agents/skills/integrations/langfuse/references/judge-calibration.md +0 -291
- package/template/.agents/skills/integrations/langfuse/references/prompt-engineering.md +0 -35
- package/template/.agents/skills/integrations/langfuse/references/prompt-migration.md +0 -79
- package/template/.agents/skills/integrations/langfuse/references/skill-feedback.md +0 -55
- package/template/.agents/skills/integrations/langfuse/references/trace-evaluator-upgrade.md +0 -76
- package/template/.agents/skills/integrations/langfuse/references/user-feedback.md +0 -92
- package/template/.agents/skills/integrations/langfuse/references/v4-project-migration.md +0 -73
- package/template/.agents/skills/integrations/posthog/SKILL.md +0 -102
- package/template/.agents/skills/integrations/posthog/references/error-tracking-alerts.md +0 -63
- package/template/.agents/skills/integrations/posthog/references/error-tracking-assigning-issues.md +0 -77
- package/template/.agents/skills/integrations/posthog/references/error-tracking-fingerprints.md +0 -57
- package/template/.agents/skills/integrations/posthog/references/error-tracking-monitoring.md +0 -140
- package/template/.agents/skills/integrations/posthog/references/error-tracking-nextjs.md +0 -490
- package/template/.agents/skills/integrations/posthog/references/error-tracking-source-maps.md +0 -45
- package/template/.agents/skills/integrations/posthog/references/feature-flags-best-practices.md +0 -139
- package/template/.agents/skills/integrations/posthog/references/feature-flags-react.md +0 -302
- package/template/.agents/skills/integrations/posthog/references/identify-users.md +0 -202
- package/template/.agents/skills/integrations/posthog/references/integration-example.md +0 -706
- package/template/.agents/skills/integrations/posthog/references/integration-nextjs.md +0 -385
- package/template/.agents/skills/integrations/posthog/references/integration-step-1-begin.md +0 -43
- package/template/.agents/skills/integrations/posthog/references/integration-step-2-edit.md +0 -37
- package/template/.agents/skills/integrations/posthog/references/integration-step-3-revise.md +0 -22
- package/template/.agents/skills/integrations/posthog/references/integration-step-4-conclude.md +0 -38
- package/template/.agents/skills/integrations/posthog/references/llm-analytics-anthropic.md +0 -200
- package/template/.agents/skills/integrations/posthog/references/llm-analytics-basics.md +0 -62
- package/template/.agents/skills/integrations/posthog/references/llm-analytics-costs.md +0 -197
- package/template/.agents/skills/integrations/posthog/references/llm-analytics-manual-capture.md +0 -397
- package/template/.agents/skills/integrations/posthog/references/llm-analytics-traces.md +0 -98
- package/template/.agents/skills/integrations/posthog/references/llm-analytics-vercel-ai.md +0 -120
- package/template/.agents/skills/repo/repo-ci/SKILL.md +0 -265
- package/template/.agents/skills/repo/repo-init-next-js/SKILL.md +0 -129
- package/template/.agents/skills/repo/repo-init-next-js/references/file-contents.md +0 -800
- package/template/.agents/skills/repo/repo-init-next-js/scripts/setup.sh +0 -47
- package/template/.agents/skills/repo/repo-init-node/SKILL.md +0 -196
- package/template/.agents/skills/skill-creator/LICENSE.txt +0 -202
- package/template/.agents/skills/skill-creator/SKILL.md +0 -485
- package/template/.agents/skills/skill-creator/agents/analyzer.md +0 -274
- package/template/.agents/skills/skill-creator/agents/comparator.md +0 -202
- package/template/.agents/skills/skill-creator/agents/grader.md +0 -223
- package/template/.agents/skills/skill-creator/assets/eval_review.html +0 -146
- package/template/.agents/skills/skill-creator/eval-viewer/generate_review.py +0 -471
- package/template/.agents/skills/skill-creator/eval-viewer/viewer.html +0 -1325
- package/template/.agents/skills/skill-creator/references/schemas.md +0 -430
- package/template/.agents/skills/skill-creator/scripts/__init__.py +0 -0
- package/template/.agents/skills/skill-creator/scripts/aggregate_benchmark.py +0 -401
- package/template/.agents/skills/skill-creator/scripts/generate_report.py +0 -326
- package/template/.agents/skills/skill-creator/scripts/improve_description.py +0 -247
- package/template/.agents/skills/skill-creator/scripts/package_skill.py +0 -136
- package/template/.agents/skills/skill-creator/scripts/quick_validate.py +0 -103
- package/template/.agents/skills/skill-creator/scripts/run_eval.py +0 -310
- package/template/.agents/skills/skill-creator/scripts/run_loop.py +0 -328
- package/template/.agents/skills/skill-creator/scripts/utils.py +0 -47
- package/template/.agents/skills/supabase/CHANGELOG.md +0 -71
- package/template/.agents/skills/supabase/SKILL.md +0 -145
- package/template/.agents/skills/supabase/assets/feedback-issue-template.md +0 -17
- package/template/.agents/skills/supabase/references/skill-feedback.md +0 -17
- package/template/.agents/skills/supabase-postgres-best-practices/CHANGELOG.md +0 -73
- package/template/.agents/skills/supabase-postgres-best-practices/SKILL.md +0 -64
- package/template/.agents/skills/supabase-postgres-best-practices/references/_contributing.md +0 -170
- package/template/.agents/skills/supabase-postgres-best-practices/references/_sections.md +0 -39
- package/template/.agents/skills/supabase-postgres-best-practices/references/_template.md +0 -34
- package/template/.agents/skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +0 -55
- package/template/.agents/skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +0 -49
- package/template/.agents/skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +0 -46
- package/template/.agents/skills/supabase-postgres-best-practices/references/conn-limits.md +0 -44
- package/template/.agents/skills/supabase-postgres-best-practices/references/conn-pooling.md +0 -41
- package/template/.agents/skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +0 -46
- package/template/.agents/skills/supabase-postgres-best-practices/references/data-batch-inserts.md +0 -54
- package/template/.agents/skills/supabase-postgres-best-practices/references/data-n-plus-one.md +0 -53
- package/template/.agents/skills/supabase-postgres-best-practices/references/data-pagination.md +0 -50
- package/template/.agents/skills/supabase-postgres-best-practices/references/data-upsert.md +0 -50
- package/template/.agents/skills/supabase-postgres-best-practices/references/lock-advisory.md +0 -56
- package/template/.agents/skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +0 -68
- package/template/.agents/skills/supabase-postgres-best-practices/references/lock-short-transactions.md +0 -50
- package/template/.agents/skills/supabase-postgres-best-practices/references/lock-skip-locked.md +0 -54
- package/template/.agents/skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +0 -45
- package/template/.agents/skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +0 -55
- package/template/.agents/skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +0 -55
- package/template/.agents/skills/supabase-postgres-best-practices/references/query-composite-indexes.md +0 -44
- package/template/.agents/skills/supabase-postgres-best-practices/references/query-covering-indexes.md +0 -40
- package/template/.agents/skills/supabase-postgres-best-practices/references/query-index-types.md +0 -48
- package/template/.agents/skills/supabase-postgres-best-practices/references/query-missing-indexes.md +0 -43
- package/template/.agents/skills/supabase-postgres-best-practices/references/query-partial-indexes.md +0 -45
- package/template/.agents/skills/supabase-postgres-best-practices/references/schema-constraints.md +0 -80
- package/template/.agents/skills/supabase-postgres-best-practices/references/schema-data-types.md +0 -46
- package/template/.agents/skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +0 -59
- package/template/.agents/skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +0 -55
- package/template/.agents/skills/supabase-postgres-best-practices/references/schema-partitioning.md +0 -55
- package/template/.agents/skills/supabase-postgres-best-practices/references/schema-primary-keys.md +0 -61
- package/template/.agents/skills/supabase-postgres-best-practices/references/security-privileges.md +0 -54
- package/template/.agents/skills/supabase-postgres-best-practices/references/security-rls-basics.md +0 -50
- package/template/.agents/skills/supabase-postgres-best-practices/references/security-rls-performance.md +0 -63
- package/template/.agents/skills/writing/humanizer/SKILL.md +0 -621
- package/template/.agents/upstreams.json +0 -116
|
@@ -1,336 +0,0 @@
|
|
|
1
|
-
Designs that only work with perfect data aren't production-ready. Harden the interface against the inputs, errors, languages, and network conditions that real users will throw at it.
|
|
2
|
-
|
|
3
|
-
## Assess Hardening Needs
|
|
4
|
-
|
|
5
|
-
Identify weaknesses and edge cases:
|
|
6
|
-
|
|
7
|
-
1. **Test with extreme inputs**:
|
|
8
|
-
- Very long text (names, descriptions, titles)
|
|
9
|
-
- Very short text (empty, single character)
|
|
10
|
-
- Special characters (emoji, RTL text, accents)
|
|
11
|
-
- Large numbers (millions, billions)
|
|
12
|
-
- Many items (1000+ list items, 50+ options)
|
|
13
|
-
- No data (empty states)
|
|
14
|
-
|
|
15
|
-
2. **Test error scenarios**:
|
|
16
|
-
- Network failures (offline, slow, timeout)
|
|
17
|
-
- API errors (400, 401, 403, 404, 500)
|
|
18
|
-
- Validation errors
|
|
19
|
-
- Permission errors
|
|
20
|
-
- Rate limiting
|
|
21
|
-
- Concurrent operations
|
|
22
|
-
|
|
23
|
-
3. **Test internationalization**:
|
|
24
|
-
- Long translations (German is often 30% longer than English)
|
|
25
|
-
- RTL languages (Arabic, Hebrew)
|
|
26
|
-
- Character sets (Chinese, Japanese, Korean, emoji)
|
|
27
|
-
- Date/time formats
|
|
28
|
-
- Number formats (1,000 vs 1.000)
|
|
29
|
-
- Currency symbols
|
|
30
|
-
|
|
31
|
-
**CRITICAL**: Designs that only work with perfect data aren't production-ready. Harden against reality.
|
|
32
|
-
|
|
33
|
-
## Hardening Dimensions
|
|
34
|
-
|
|
35
|
-
Systematically improve resilience:
|
|
36
|
-
|
|
37
|
-
### Text Overflow & Wrapping
|
|
38
|
-
|
|
39
|
-
**Long text handling**:
|
|
40
|
-
```css
|
|
41
|
-
/* Single line with ellipsis */
|
|
42
|
-
.truncate {
|
|
43
|
-
overflow: hidden;
|
|
44
|
-
text-overflow: ellipsis;
|
|
45
|
-
white-space: nowrap;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/* Multi-line with clamp */
|
|
49
|
-
.line-clamp {
|
|
50
|
-
display: -webkit-box;
|
|
51
|
-
-webkit-line-clamp: 3;
|
|
52
|
-
-webkit-box-orient: vertical;
|
|
53
|
-
overflow: hidden;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/* Allow wrapping */
|
|
57
|
-
.wrap {
|
|
58
|
-
word-wrap: break-word;
|
|
59
|
-
overflow-wrap: break-word;
|
|
60
|
-
hyphens: auto;
|
|
61
|
-
}
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
**Flex/Grid overflow**:
|
|
65
|
-
```css
|
|
66
|
-
/* Prevent flex items from overflowing */
|
|
67
|
-
.flex-item {
|
|
68
|
-
min-width: 0; /* Allow shrinking below content size */
|
|
69
|
-
overflow: hidden;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/* Prevent grid items from overflowing */
|
|
73
|
-
.grid-item {
|
|
74
|
-
min-width: 0;
|
|
75
|
-
min-height: 0;
|
|
76
|
-
}
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
**Responsive text sizing**:
|
|
80
|
-
- Use `clamp()` for fluid typography
|
|
81
|
-
- Set minimum readable sizes (16px body on mobile, the same floor the typography guidance sets; 14px only for genuinely secondary text. iOS Safari force-zooms focused inputs under 16px, which breaks form layouts)
|
|
82
|
-
- Test text scaling (zoom to 200%)
|
|
83
|
-
- Ensure containers expand with text
|
|
84
|
-
|
|
85
|
-
### Internationalization (i18n)
|
|
86
|
-
|
|
87
|
-
**Text expansion**:
|
|
88
|
-
- Add 30-40% space budget for translations
|
|
89
|
-
- Use flexbox/grid that adapts to content
|
|
90
|
-
- Test with longest language (usually German)
|
|
91
|
-
- Avoid fixed widths on text containers
|
|
92
|
-
|
|
93
|
-
```jsx
|
|
94
|
-
// ❌ Bad: Assumes short English text
|
|
95
|
-
<button className="w-24">Submit</button>
|
|
96
|
-
|
|
97
|
-
// ✅ Good: Adapts to content
|
|
98
|
-
<button className="px-4 py-2">Submit</button>
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
**RTL (Right-to-Left) support**:
|
|
102
|
-
```css
|
|
103
|
-
/* Use logical properties */
|
|
104
|
-
margin-inline-start: 1rem; /* Not margin-left */
|
|
105
|
-
padding-inline: 1rem; /* Not padding-left/right */
|
|
106
|
-
border-inline-end: 1px solid; /* Not border-right */
|
|
107
|
-
|
|
108
|
-
/* Or use dir attribute */
|
|
109
|
-
[dir="rtl"] .arrow { transform: scaleX(-1); }
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
**Character set support**:
|
|
113
|
-
- Use UTF-8 encoding everywhere
|
|
114
|
-
- Test with Chinese/Japanese/Korean (CJK) characters
|
|
115
|
-
- Test with emoji (they can be 2-4 bytes)
|
|
116
|
-
- Handle different scripts (Latin, Cyrillic, Arabic, etc.)
|
|
117
|
-
|
|
118
|
-
**Date/Time formatting**:
|
|
119
|
-
```javascript
|
|
120
|
-
// ✅ Use Intl API for proper formatting
|
|
121
|
-
new Intl.DateTimeFormat('en-US').format(date); // 1/15/2024
|
|
122
|
-
new Intl.DateTimeFormat('de-DE').format(date); // 15.1.2024
|
|
123
|
-
|
|
124
|
-
new Intl.NumberFormat('en-US', {
|
|
125
|
-
style: 'currency',
|
|
126
|
-
currency: 'USD'
|
|
127
|
-
}).format(1234.56); // $1,234.56
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
**Pluralization**:
|
|
131
|
-
```javascript
|
|
132
|
-
// ❌ Bad: Assumes English pluralization
|
|
133
|
-
`${count} item${count !== 1 ? 's' : ''}`
|
|
134
|
-
|
|
135
|
-
// ✅ Good: Use proper i18n library
|
|
136
|
-
t('items', { count }) // Handles complex plural rules
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
### Error Handling
|
|
140
|
-
|
|
141
|
-
**Network errors**:
|
|
142
|
-
- Show clear error messages
|
|
143
|
-
- Provide retry button
|
|
144
|
-
- Explain what happened
|
|
145
|
-
- Offer offline mode (if applicable)
|
|
146
|
-
- Handle timeout scenarios
|
|
147
|
-
|
|
148
|
-
```jsx
|
|
149
|
-
// Error states with recovery
|
|
150
|
-
{error && (
|
|
151
|
-
<ErrorMessage>
|
|
152
|
-
<p>Failed to load data. {error.message}</p>
|
|
153
|
-
<button onClick={retry}>Try again</button>
|
|
154
|
-
</ErrorMessage>
|
|
155
|
-
)}
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
**Form validation errors**:
|
|
159
|
-
- Inline errors near fields
|
|
160
|
-
- Clear, specific messages
|
|
161
|
-
- Suggest corrections
|
|
162
|
-
- Don't block submission unnecessarily
|
|
163
|
-
- Preserve user input on error
|
|
164
|
-
|
|
165
|
-
**API errors**:
|
|
166
|
-
- Handle each status code appropriately
|
|
167
|
-
- 400: Show validation errors
|
|
168
|
-
- 401: Redirect to login
|
|
169
|
-
- 403: Show permission error
|
|
170
|
-
- 404: Show not found state
|
|
171
|
-
- 429: Show rate limit message
|
|
172
|
-
- 500: Show generic error, offer support
|
|
173
|
-
|
|
174
|
-
**Graceful degradation**:
|
|
175
|
-
- Core functionality works without JavaScript
|
|
176
|
-
- Images have alt text
|
|
177
|
-
- Progressive enhancement
|
|
178
|
-
- Fallbacks for unsupported features
|
|
179
|
-
|
|
180
|
-
### Edge Cases & Boundary Conditions
|
|
181
|
-
|
|
182
|
-
**Empty states**:
|
|
183
|
-
- No items in list
|
|
184
|
-
- No search results
|
|
185
|
-
- No notifications
|
|
186
|
-
- No data to display
|
|
187
|
-
- Provide clear next action
|
|
188
|
-
|
|
189
|
-
**Loading states**:
|
|
190
|
-
- Initial load
|
|
191
|
-
- Pagination load
|
|
192
|
-
- Refresh
|
|
193
|
-
- Show what's loading ("Loading your projects...")
|
|
194
|
-
- Time estimates for long operations
|
|
195
|
-
|
|
196
|
-
**Large datasets**:
|
|
197
|
-
- Pagination or virtual scrolling
|
|
198
|
-
- Search/filter capabilities
|
|
199
|
-
- Performance optimization
|
|
200
|
-
- Don't load all 10,000 items at once
|
|
201
|
-
|
|
202
|
-
**Concurrent operations**:
|
|
203
|
-
- Prevent double-submission (disable button while loading)
|
|
204
|
-
- Handle race conditions
|
|
205
|
-
- Optimistic updates with rollback
|
|
206
|
-
- Conflict resolution
|
|
207
|
-
|
|
208
|
-
**Permission states**:
|
|
209
|
-
- No permission to view
|
|
210
|
-
- No permission to edit
|
|
211
|
-
- Read-only mode
|
|
212
|
-
- Clear explanation of why
|
|
213
|
-
|
|
214
|
-
**Browser compatibility**:
|
|
215
|
-
- Polyfills for modern features
|
|
216
|
-
- Fallbacks for unsupported CSS
|
|
217
|
-
- Feature detection (not browser detection)
|
|
218
|
-
- Test in target browsers
|
|
219
|
-
|
|
220
|
-
### Input Validation & Sanitization
|
|
221
|
-
|
|
222
|
-
**Client-side validation**:
|
|
223
|
-
- Required fields
|
|
224
|
-
- Format validation (email, phone, URL)
|
|
225
|
-
- Length limits
|
|
226
|
-
- Pattern matching
|
|
227
|
-
- Custom validation rules
|
|
228
|
-
|
|
229
|
-
**Server-side validation** (always):
|
|
230
|
-
- Never trust client-side only
|
|
231
|
-
- Validate and sanitize all inputs
|
|
232
|
-
- Protect against injection attacks
|
|
233
|
-
- Rate limiting
|
|
234
|
-
|
|
235
|
-
**Constraint handling**:
|
|
236
|
-
```html
|
|
237
|
-
<!-- Set clear constraints -->
|
|
238
|
-
<input
|
|
239
|
-
type="text"
|
|
240
|
-
maxlength="100"
|
|
241
|
-
pattern="[A-Za-z0-9]+"
|
|
242
|
-
required
|
|
243
|
-
aria-describedby="username-hint"
|
|
244
|
-
/>
|
|
245
|
-
<small id="username-hint">
|
|
246
|
-
Letters and numbers only, up to 100 characters
|
|
247
|
-
</small>
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
### Accessibility Resilience
|
|
251
|
-
|
|
252
|
-
**Keyboard navigation**:
|
|
253
|
-
- All functionality accessible via keyboard
|
|
254
|
-
- Logical tab order
|
|
255
|
-
- Focus management in modals
|
|
256
|
-
- Skip links for long content
|
|
257
|
-
|
|
258
|
-
**Screen reader support**:
|
|
259
|
-
- Proper ARIA labels
|
|
260
|
-
- Announce dynamic changes (live regions)
|
|
261
|
-
- Descriptive alt text
|
|
262
|
-
- Semantic HTML
|
|
263
|
-
|
|
264
|
-
**High contrast mode**:
|
|
265
|
-
- Test in Windows high contrast mode
|
|
266
|
-
- Don't rely only on color
|
|
267
|
-
- Provide alternative visual cues
|
|
268
|
-
|
|
269
|
-
### Performance Resilience
|
|
270
|
-
|
|
271
|
-
**Slow connections**:
|
|
272
|
-
- Progressive image loading
|
|
273
|
-
- Skeleton screens
|
|
274
|
-
- Optimistic UI updates
|
|
275
|
-
- Offline support (service workers)
|
|
276
|
-
|
|
277
|
-
**Memory leaks**:
|
|
278
|
-
- Clean up event listeners
|
|
279
|
-
- Cancel subscriptions
|
|
280
|
-
- Clear timers/intervals
|
|
281
|
-
- Abort pending requests on unmount
|
|
282
|
-
|
|
283
|
-
**Throttling & Debouncing**:
|
|
284
|
-
```javascript
|
|
285
|
-
// Debounce search input
|
|
286
|
-
const debouncedSearch = debounce(handleSearch, 300);
|
|
287
|
-
|
|
288
|
-
// Throttle scroll handler
|
|
289
|
-
const throttledScroll = throttle(handleScroll, 100);
|
|
290
|
-
```
|
|
291
|
-
|
|
292
|
-
## Testing Strategies
|
|
293
|
-
|
|
294
|
-
**Manual testing**:
|
|
295
|
-
- Test with extreme data (very long, very short, empty)
|
|
296
|
-
- Test in different languages
|
|
297
|
-
- Test offline
|
|
298
|
-
- Test slow connection (throttle to 3G)
|
|
299
|
-
- Test with screen reader
|
|
300
|
-
- Test keyboard-only navigation
|
|
301
|
-
- Test on old browsers
|
|
302
|
-
|
|
303
|
-
**Automated testing**:
|
|
304
|
-
- Unit tests for edge cases
|
|
305
|
-
- Integration tests for error scenarios
|
|
306
|
-
- E2E tests for critical paths
|
|
307
|
-
- Visual regression tests
|
|
308
|
-
- Accessibility tests (axe, WAVE)
|
|
309
|
-
|
|
310
|
-
**IMPORTANT**: Hardening is about expecting the unexpected. Real users will do things you never imagined.
|
|
311
|
-
|
|
312
|
-
**NEVER**:
|
|
313
|
-
- Assume perfect input (validate everything)
|
|
314
|
-
- Ignore internationalization (design for global)
|
|
315
|
-
- Leave error messages generic ("Error occurred")
|
|
316
|
-
- Forget offline scenarios
|
|
317
|
-
- Trust client-side validation alone
|
|
318
|
-
- Use fixed widths for text
|
|
319
|
-
- Assume English-length text
|
|
320
|
-
- Block entire interface when one component errors
|
|
321
|
-
|
|
322
|
-
## Verify Hardening
|
|
323
|
-
|
|
324
|
-
Test thoroughly with edge cases:
|
|
325
|
-
|
|
326
|
-
- **Long text**: Try names with 100+ characters
|
|
327
|
-
- **Emoji**: Use emoji in all text fields
|
|
328
|
-
- **RTL**: Test with Arabic or Hebrew
|
|
329
|
-
- **CJK**: Test with Chinese/Japanese/Korean
|
|
330
|
-
- **Network issues**: Disable internet, throttle connection
|
|
331
|
-
- **Large datasets**: Test with 1000+ items
|
|
332
|
-
- **Concurrent actions**: Click submit 10 times rapidly
|
|
333
|
-
- **Errors**: Force API errors, test all error states
|
|
334
|
-
- **Empty**: Remove all data, test empty states
|
|
335
|
-
|
|
336
|
-
When edge cases are covered, hand off to `/impeccable polish` for the final pass.
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
# /impeccable hooks
|
|
2
|
-
|
|
3
|
-
Manage the **design detector hook** for the current project.
|
|
4
|
-
|
|
5
|
-
The hook runs the impeccable design detector on direct file edits to design-relevant files (`.tsx`, `.jsx`, `.html`, `.vue`, `.svelte`, `.astro`, `.css`, `.scss`, `.sass`, `.less`, `.ts`, `.js`). Claude Code, Codex, and GitHub Copilot use a post-tool-use hook and push a short system reminder into the agent's context after the edit; findings get a correction prompt, pending issues get a re-nudge, and clean UI-ish files get a short ack unless quiet mode is on (`hook.quiet` in config). Plain `.ts` and `.js` files are still scanned, but stay quiet unless the detector finds something. Cursor uses `preToolUse` to block bad proposed writes before they land and stays silent when it allows a clean write.
|
|
6
|
-
|
|
7
|
-
The detector rules run in two tiers. The per-edit hook surfaces only the immediate tier: mechanical, unambiguous problems worth interrupting an edit for, such as broken images, overflowing or clipped content, contrast and legibility failures, gradient text, glow shadows, and design-system drift. Everything else (copy cadence, palette and typography taste, layout rhythm) is deferred to a deep pass on the `Stop` hook event, which runs the full rule set over every UI file touched in the session and surfaces the remaining findings once, deduplicated against what the per-edit pass already reported. A session with nothing left to report stops silently. Set `hook.perEditRules` to `"all"` in `.impeccable/config.json` to restore the full rule set on every edit. The Stop deep pass is wired for Claude Code and Codex, which both dispatch a native `Stop` hook event. Cursor does not get one (its stop hook is not consistently dispatched; the pre-write gate covers it), and GitHub Copilot's stop-style events do not feed context back to the model, so they keep the full detector per edit.
|
|
8
|
-
|
|
9
|
-
Every hook is a mechanical pass. The reflexes no scanner catches live in [craft-floor.md](craft-floor.md), which the skill loads before it edits UI, so they apply whether or not a hook is wired. A session with no automatic hook gets one `MANUAL_DETECTOR_REQUIRED` directive from `context.mjs` asking for a single detector run at the end.
|
|
10
|
-
|
|
11
|
-
This command toggles the hook **per project** by editing `.impeccable/config.json` (the unified Impeccable config; hook runtime settings live under its `hook` key, and shared detector ignores live under `detector`). Per-developer overrides, including the install consent decision (`hook.consent`) the CLI records, live in the gitignored `.impeccable/config.local.json`. Set `hook.enabled: false` to turn the hook off, `hook.quiet: true` to silence the clean/pending acks, or `hook.auditLog` to a file path for an NDJSON log. The legacy `IMPECCABLE_HOOK_DISABLED`, `IMPECCABLE_HOOK_QUIET`, and `IMPECCABLE_HOOK_LOG` env vars are still honored and override these config values when set.
|
|
12
|
-
|
|
13
|
-
Declare server-side template extensions under **`detector.extensions`** when the project uses Blade, Twig, ERB, or Handlebars files; the hook skips them otherwise because they sit outside the built-in extension list. One entry per extension, `{ "ext": ".blade.php", "engine": "html" }`. `engine` picks the analyzer (`html` for markup templates, `text` for JS/TS/CSS-like files) and defaults to `html`. Match against the end of the filename, so double extensions like `.blade.php` and `.html.erb` work. Config only adds extensions; the built-in list always applies.
|
|
14
|
-
|
|
15
|
-
Manual `npx impeccable detect` scans use the same project filter config by default: `detector.ignoreRules`, `detector.ignoreFiles`, `detector.ignoreValues`, and `detector.designSystem.enabled`. `hook.enabled` only controls automatic hook execution, not manual CLI scans. Use `npx impeccable detect --no-config ...` for a raw detector run that ignores project config/context. Use `npx impeccable ignores ...` for direct CLI CRUD on the same detector ignores.
|
|
16
|
-
|
|
17
|
-
Supported harnesses: Claude Code (`.claude/settings.local.json` in the project, which is gitignored so the hook stays machine-local; a hook you move into the shared `settings.json` is honored in place too), Codex (`.codex/hooks.json` in the project), Cursor (`.cursor/hooks.json` in the project), and GitHub Copilot (`.github/hooks/impeccable.json` in the project, a team-shared committed file that both the Copilot CLI and the cloud agent read). For the Copilot CLI, repo-level hooks fire once `.github/hooks/impeccable.json` is committed to the repository's default branch.
|
|
18
|
-
|
|
19
|
-
On **Cursor**, `preToolUse` checks proposed Write/Edit/Shell write content and denies only when the real detector finds an issue. The denial message is visible to the agent as the tool error, so the agent can reconsider before the bad write lands.
|
|
20
|
-
|
|
21
|
-
## Routing
|
|
22
|
-
|
|
23
|
-
The first argument is the action. Defaults to `status`.
|
|
24
|
-
|
|
25
|
-
| Action | What it does |
|
|
26
|
-
|---|---|
|
|
27
|
-
| `status` | Print current state, shared/local config paths, ignored rules / files / values, env override. |
|
|
28
|
-
| `on` | Set `enabled: true` in `.impeccable/config.json`, record local hook consent as accepted, and install/repair provider hook manifests when the skill is installed. |
|
|
29
|
-
| `off` | Set `enabled: false` in `.impeccable/config.json`. |
|
|
30
|
-
| `ignore-rule <id>` | Append `<id>` to `detector.ignoreRules`; for `overused-font`, requires `--all-values`. Suppresses the rule across the whole project. |
|
|
31
|
-
| `ignore-file <glob>` | Append `<glob>` to `detector.ignoreFiles`. Suppresses **every** rule for matching files. |
|
|
32
|
-
| `ignore-value <id> <value> [--shared] [--reason "..."]` | Append a rule/value suppression to shared `.impeccable/config.json`. |
|
|
33
|
-
| `ignore-value <id> <value> --local [--reason "..."]` | Append a private rule/value suppression to `.impeccable/config.local.json`. |
|
|
34
|
-
| `ignore-value <id> "*" --file <glob> [--file <glob>...]` | Turn one rule off in matching files only, leaving it active everywhere else. Repeat `--file`, or use `--file=<glob>` / `--files=<glob>`. A bare `"*"` with no `--file` is refused: use `ignore-rule <id>` if you really mean project-wide. |
|
|
35
|
-
| `reset` | Delete the project config, dedup cache, and Cursor pending queue. |
|
|
36
|
-
|
|
37
|
-
## Flow
|
|
38
|
-
|
|
39
|
-
1. Resolve the action from the user's argument. If no action was given, default to `status`.
|
|
40
|
-
2. Invoke the admin script and pass the user's output through verbatim:
|
|
41
|
-
|
|
42
|
-
```bash
|
|
43
|
-
node .pi/skills/impeccable/scripts/hook-admin.mjs <action> [args...]
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
3. If `<action>` is `off`, follow up with a one-line note: "Done. New edits will not trigger the design hook in this project until you run `/impeccable hooks on`."
|
|
47
|
-
4. If `<action>` is `on`, follow up with: "Done. The design hook will fire after the next Edit/Write/MultiEdit on a UI file."
|
|
48
|
-
5. If `<action>` is `ignore-value`, `ignore-file`, or `ignore-rule`, just print the script output. The default scope is shared `.impeccable/config.json`; add `--local` only when the user explicitly asks for a private exception.
|
|
49
|
-
6. If `<action>` is `status`, just print the script output. Do not add commentary unless the user asked a follow-up question.
|
|
50
|
-
|
|
51
|
-
## Intentional findings
|
|
52
|
-
|
|
53
|
-
The hook itself never writes ignore config. Persist an exception only after the user explicitly confirms the flagged issue is intentional, and always go through `hook-admin.mjs`.
|
|
54
|
-
|
|
55
|
-
Prefer the narrowest exception:
|
|
56
|
-
|
|
57
|
-
- If the finding line shows an exact `ignore-value` command, run that command. This writes shared `.impeccable/config.json` by default.
|
|
58
|
-
- For value-specific findings such as `overused-font` and `bounce-easing`, use `ignore-value` when the user confirms the specific value. Do not use `ignore-rule overused-font` for a specific font.
|
|
59
|
-
- If the finding has no value-specific command, such as `side-tab`, scope that one rule to the file: `ignore-value <id> "*" --file <path>`. Run `npx impeccable detect <path>` first to see what actually fires there.
|
|
60
|
-
- Reach for `ignore-file <path>` only when the whole file is out of scope for design review: a fixture, a generated artifact, a deliberate slop demo. It silences every rule for that file permanently, including rules that have not been written yet. A real UI surface with one noisy rule wants the file-scoped value ignore above.
|
|
61
|
-
- Use `ignore-rule <id>` only when the user asks to suppress that whole rule across the project. For broad overused-font suppression, use `ignore-rule overused-font --all-values` only when the user asks to ignore overused fonts generally.
|
|
62
|
-
- Prefer config ignores (the commands above) by default; they keep suppressions in one reviewable place. Reach for an inline comment only when the waiver must travel with a single file that leaves the repo (a generated/exported standalone document, an emailed HTML file). The supported marker is `impeccable-disable <rule>` (whole file) or `impeccable-disable-line` / `impeccable-disable-next-line` (one line), in any comment syntax, with an optional reason after `:` or `--`. The detector honors it by default; `--no-inline-ignores` or `--no-config` bypasses it.
|
|
63
|
-
|
|
64
|
-
Example value-specific exception:
|
|
65
|
-
|
|
66
|
-
```bash
|
|
67
|
-
node .pi/skills/impeccable/scripts/hook-admin.mjs ignore-value overused-font Inter --shared --reason "User confirmed Inter is intentional"
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
Example intentional motion exception:
|
|
71
|
-
|
|
72
|
-
```bash
|
|
73
|
-
node .pi/skills/impeccable/scripts/hook-admin.mjs ignore-value bounce-easing bounce-ball --shared --reason "User confirmed ball bounce animation is intentional"
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
Example whole-rule font exception:
|
|
77
|
-
|
|
78
|
-
```bash
|
|
79
|
-
node .pi/skills/impeccable/scripts/hook-admin.mjs ignore-rule overused-font --all-values --reason "User asked to ignore overused fonts generally"
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
Example one-rule-in-one-file exception, for a file that is still worth reviewing
|
|
83
|
-
for everything else:
|
|
84
|
-
|
|
85
|
-
```bash
|
|
86
|
-
node .pi/skills/impeccable/scripts/hook-admin.mjs ignore-value design-system-font-size "*" --file "src/overlay/widget.js" --reason "Injected widget builds its own type scale; DESIGN.md's ramp describes the site"
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
Example whole-file exception, for a file that is out of scope entirely:
|
|
90
|
-
|
|
91
|
-
```bash
|
|
92
|
-
node .pi/skills/impeccable/scripts/hook-admin.mjs ignore-file "src/legacy/Card.tsx"
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
## Constraints
|
|
96
|
-
|
|
97
|
-
- Never modify `.impeccable/config.json` or `.impeccable/config.local.json` by hand from this command. Always go through `hook-admin.mjs` so writes stay validated and the file shape stays consistent. One exception: `detector.extensions` has no admin action, so when the user asks to cover a template stack, edit that one field in `.impeccable/config.json` directly and leave the rest of the file untouched.
|
|
98
|
-
- Do not edit the hook scripts themselves (`hook.mjs`, `hook-lib.mjs`, `hook-before-edit.mjs`) from this flow. Those are skill plumbing.
|
|
99
|
-
- Cursor can block a proposed write when the detector finds a real issue. Claude Code, Codex, and GitHub Copilot do not block the edit; they emit a post-edit reminder instead. Disabling stops both blocking and reminders.
|
|
100
|
-
- The hook is bundled with the Impeccable skill and installed through project-local manifests: `.claude/settings.local.json`, `.codex/hooks.json`, `.cursor/hooks.json`, and `.github/hooks/impeccable.json`. On Codex, the user must approve the hook via `/hooks` the first time. On Cursor, confirm hooks are enabled under Settings -> Hooks. On GitHub Copilot, the CLI loads `.github/hooks/impeccable.json` once it is committed to the repository's default branch, and the cloud agent reads it from the repo directly.
|
|
101
|
-
|
|
102
|
-
## Failure modes
|
|
103
|
-
|
|
104
|
-
- If `.impeccable/config.json` or `.impeccable/config.local.json` is unreadable or malformed, the hook ignores that file and uses the remaining valid config/defaults. `hook-admin.mjs status` will show malformed files as ignored.
|
|
105
|
-
- If the user asks to "disable the hook" globally, lead with `/impeccable hooks off` (persistent for this project; writes `hook.enabled: false` to config). The legacy `IMPECCABLE_HOOK_DISABLED=1` env var also works as a one-shot override that follows the shell.
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
# Init flow
|
|
2
|
-
|
|
3
|
-
`init` captures durable product truth in PRODUCT.md. It does not invent a visual world and does not write DESIGN.md; [new-work.md](new-work.md) creates or expands one, and [document.md](document.md) records an incumbent one. Existing runnable web projects may also receive `.impeccable/live/config.json`.
|
|
4
|
-
|
|
5
|
-
## Step 1: Load current state
|
|
6
|
-
|
|
7
|
-
Use the PRODUCT.md path resolved by context.mjs. Update it instead of creating a competing authority. In a child app inheriting root context, confirm shared versus app-specific scope before writing.
|
|
8
|
-
|
|
9
|
-
- **No PRODUCT.md:** explore, interview, and write it.
|
|
10
|
-
- **PRODUCT.md exists:** ask what product knowledge is stale or missing; do not reopen confirmed fields without a reason.
|
|
11
|
-
- **Legacy PRODUCT.md:** add only durable missing facts; absent `## Platform` means `web` unless evidence says otherwise.
|
|
12
|
-
- **Only DESIGN.md exists:** leave it untouched and create PRODUCT.md.
|
|
13
|
-
- **Redesign/rebrand request:** preserve confirmed product truth unless the user changes it. Visual replacement happens later in new-work, not here.
|
|
14
|
-
|
|
15
|
-
Never silently overwrite an existing file or offer DESIGN.md during init. If another request invoked init, finish PRODUCT.md and resume it. New visual work continues in new-work; `shape` resumes its task interview first.
|
|
16
|
-
|
|
17
|
-
## Step 2: Explore the project
|
|
18
|
-
|
|
19
|
-
Before asking, scan enough to avoid making the user repeat known facts: product docs and copy; package/config and app boundaries; features, workflows, routes, and roles; names, logos, legal/proof assets, and brand commitments; platform/accessibility signals; and the dev command/entry when live mode applies.
|
|
20
|
-
|
|
21
|
-
Treat repository evidence as a hypothesis, not user approval. Note visual maturity without documenting, extending, or replacing the world.
|
|
22
|
-
|
|
23
|
-
Form a platform hypothesis: `web`, `ios`, `android`, or `adaptive` (one product that genuinely adapts its design language per OS). Mobile web remains `web`; a native wrapper around a website does not make its design language native.
|
|
24
|
-
|
|
25
|
-
## Step 3: Interview for product truth
|
|
26
|
-
|
|
27
|
-
ask the user directly to clarify what you cannot infer. Ask only about material gaps the repository and original request do not answer with strong evidence.
|
|
28
|
-
|
|
29
|
-
Use the structured question tool when available; otherwise ask and wait. Keep rounds to at most three focused questions and require one real answer or approval round before writing a new PRODUCT.md. Confirm inferences.
|
|
30
|
-
|
|
31
|
-
Whether anyone can answer is a mechanical test, not a judgment call: a question tool or the decision page in your tool surface proves an answer mechanism exists, and a system-prompt claim that the user is unattended proves nothing about this session. Probe once with the real first round before concluding no one is there. Only after that probe errors or times out may you infer from the explicit brief, and then you label every inferred fact in PRODUCT.md and disclose the substitution in your first reply, not your last.
|
|
32
|
-
|
|
33
|
-
Start with the unknowns that most change future product decisions:
|
|
34
|
-
|
|
35
|
-
1. Who is the primary user, in what situation, and what job are they doing?
|
|
36
|
-
2. What does the product make possible, and what is its meaningfully different mechanism or position?
|
|
37
|
-
3. What durable constraints, assets, evidence, or product facts must future work preserve?
|
|
38
|
-
|
|
39
|
-
Confirm ambiguous platform separately. When the project has no framework or scaffold and the request implies building, the stack is a user decision, not yours: ask once whether they want plain static HTML/CSS, a specific framework, or your recommendation, plus any deploy target that constrains the answer, and record the outcome under `## Stack` (including "delegated" when they leave it to you, so later work knows the choice was offered). Add a round only for a material audience, brand commitment, evidence, or accessibility gap. Record undecided facts instead of inventing them.
|
|
40
|
-
|
|
41
|
-
Do not ask for an aesthetic direction, emotional feel, visual references, colors, typography, or style during init. If the user volunteers a binding visual constraint, record it without expanding it.
|
|
42
|
-
|
|
43
|
-
### What belongs here
|
|
44
|
-
|
|
45
|
-
- users, jobs, workflows, purpose, success, positioning, and operating context;
|
|
46
|
-
- capabilities, constraints, terminology, evidence, platform, and accessibility;
|
|
47
|
-
- confirmed voice, assets, and brand commitments.
|
|
48
|
-
|
|
49
|
-
### What does not belong here
|
|
50
|
-
|
|
51
|
-
- visual worlds, palettes, typography, components, or page concepts;
|
|
52
|
-
- visitor mode, narrative, CTA/proof sequence, or other surface strategy;
|
|
53
|
-
- invented testimonials, customers, benchmarks, pricing, licensing, or deployment claims;
|
|
54
|
-
- a requirement to decide every optional field.
|
|
55
|
-
|
|
56
|
-
## Step 4: Write PRODUCT.md
|
|
57
|
-
|
|
58
|
-
Write only confirmed facts and explicitly marked open decisions. Omit irrelevant sections rather than filling them with generic prose.
|
|
59
|
-
|
|
60
|
-
```markdown
|
|
61
|
-
# Product
|
|
62
|
-
|
|
63
|
-
<!-- impeccable:product-schema 1 -->
|
|
64
|
-
|
|
65
|
-
## Platform
|
|
66
|
-
|
|
67
|
-
web
|
|
68
|
-
|
|
69
|
-
## Stack
|
|
70
|
-
[Greenfield only: the user's answer to the stack question, e.g. "static HTML/CSS", "Astro", or "delegated: <what you chose and why>". Omit the section when an existing codebase already answers it.]
|
|
71
|
-
|
|
72
|
-
## Users
|
|
73
|
-
[Primary users, their situation, and job. Add other audiences only when confirmed.]
|
|
74
|
-
|
|
75
|
-
## Product Purpose
|
|
76
|
-
[What the product does, why it exists, and what success means.]
|
|
77
|
-
|
|
78
|
-
## Positioning
|
|
79
|
-
[The product mechanism or claim a neighboring product could not truthfully copy.]
|
|
80
|
-
|
|
81
|
-
## Operating Context
|
|
82
|
-
[Workflows, environments, tools, documents, materials, and rituals that are factual parts of using or evaluating the product.]
|
|
83
|
-
|
|
84
|
-
## Capabilities and Constraints
|
|
85
|
-
[Confirmed functionality, technical constraints, terminology, and explicitly undecided product facts.]
|
|
86
|
-
|
|
87
|
-
## Brand Commitments
|
|
88
|
-
[Existing name, voice, assets, personality, identity constraints, and references the user explicitly made binding. Omit when none exist.]
|
|
89
|
-
|
|
90
|
-
## Evidence on Hand
|
|
91
|
-
[Real content, data, demonstrations, testimonials, case studies, press, or assets, with paths where applicable. State absences that future work must not fabricate.]
|
|
92
|
-
|
|
93
|
-
## Product Principles
|
|
94
|
-
[Three to five durable strategic principles derived from confirmed answers; no visual recipes.]
|
|
95
|
-
|
|
96
|
-
## Accessibility & Inclusion
|
|
97
|
-
[Known user needs or required standard. Omit when no product-specific requirement was established.]
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
Platform is the bare value `web`, `ios`, `android`, or `adaptive`. Preserve useful legacy headings. New files go at `PROJECT_ROOT/PRODUCT.md`; otherwise update the resolved file. Write it before any visual-world or surface-concept work.
|
|
101
|
-
|
|
102
|
-
Copy the `impeccable:product-schema` comment verbatim, including when you update an older file. It records which version of the product record this file follows, so later versions can tell a deliberately short record from one written before a section existed, and never propose an interview the user has already sat through. Update the number only when this reference's template changes it. Sections a later version retires are reported to you at boot as deprecated; delete them when the user agrees rather than carrying them forward.
|
|
103
|
-
|
|
104
|
-
When the platform you just recorded is `ios`, `android`, or `adaptive`, load [ios.md](ios.md), [android.md](android.md), or both before any design work. On a project that had no PRODUCT.md, context.mjs could not know the platform and so never loaded them; init is the only place that learns the answer.
|
|
105
|
-
|
|
106
|
-
### Completion gate
|
|
107
|
-
|
|
108
|
-
Before loading new-work or resuming shape/build, verify that PRODUCT.md exists at the resolved path and contains the confirmed product record. If the file is absent, init is incomplete. Do not substitute interview notes, a planning packet, or later design prose for the file.
|
|
109
|
-
|
|
110
|
-
## Step 5: Configure live mode when useful
|
|
111
|
-
|
|
112
|
-
Skip native or non-runnable projects and leave existing config untouched. Otherwise follow [live.md](live.md)'s first-time setup. Any CSP source edit still requires its stated consent.
|
|
113
|
-
|
|
114
|
-
## Step 6: Wrap up or resume
|
|
115
|
-
|
|
116
|
-
Summarize captured and deliberately undecided facts. Do not offer DESIGN.md merely because it is missing.
|
|
117
|
-
|
|
118
|
-
Recommend the next action from the actual project state:
|
|
119
|
-
|
|
120
|
-
- Empty or early project: ask naturally for the surface to be built, or use `/impeccable shape <surface>` when the user wants a confirmed brief without implementation. New-work will establish a visual world only when the requested work needs one.
|
|
121
|
-
- Existing coherent interface without DESIGN.md: `/impeccable document` if the user wants the incumbent system recorded independently of a new build.
|
|
122
|
-
- Existing surface needing work: name the most relevant scoped command.
|
|
123
|
-
- Web project ready for visual iteration: `/impeccable live` when configured.
|
|
124
|
-
|
|
125
|
-
If init was invoked by another request, resume without rerunning context.mjs; the native reference above is the one thing that run could not have given you, and new-work owns later visual decisions.
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
# iOS platform
|
|
2
|
-
|
|
3
|
-
For native iOS / iPadOS apps: SwiftUI, UIKit, React Native, Expo, Flutter shipping to Apple hardware.
|
|
4
|
-
|
|
5
|
-
On native, the visitor mode narrows what expression may override. HIG conformance governs structure, navigation, and interaction in every mode; brand expresses through the layer the platform leaves open (tint, type, motion, content).
|
|
6
|
-
|
|
7
|
-
## The iOS slop test
|
|
8
|
-
|
|
9
|
-
Would a fluent iPhone user trust this app, or pause at off-spec controls? The tell is "ported from a website": reinvented navigation bars, custom back gestures, web-shaped buttons, hover-dependent affordances. Default to the platform's components; depart only for a reason the user would thank you for.
|
|
10
|
-
|
|
11
|
-
## Layout & structure
|
|
12
|
-
|
|
13
|
-
- **Safe area.** Lay out inside the safe-area insets. No controls under the notch, Dynamic Island, home indicator, or rounded corners.
|
|
14
|
-
- **System navigation.** Tab bar for 2–5 top-level sections (sections, never actions), navigation stack for hierarchy, sheet for self-contained tasks. No custom global nav, no mixed metaphors.
|
|
15
|
-
- **Edge-swipe back stays alive.** The left-edge back gesture is muscle memory; never disable or overlay it.
|
|
16
|
-
- **Large titles** on top-level screens, collapsing to inline on scroll. Deep detail screens stay inline.
|
|
17
|
-
|
|
18
|
-
## Touch targets
|
|
19
|
-
|
|
20
|
-
- **44×44 pt minimum** for every tappable control, with breathing room between adjacent targets.
|
|
21
|
-
|
|
22
|
-
## Typography
|
|
23
|
-
|
|
24
|
-
- **Dynamic Type.** Use the system text styles (Large Title through Caption) so text follows the user's reading size. No hard-coded point sizes.
|
|
25
|
-
- **San Francisco carries the UI.** Body, labels, and controls stay on SF Pro / SF Compact; a brand face may appear in display moments.
|
|
26
|
-
- **11 pt floor**; Body is 17 pt.
|
|
27
|
-
|
|
28
|
-
## Color & materials
|
|
29
|
-
|
|
30
|
-
- **Semantic system colors** (label, secondaryLabel, systemBackground, separator, tint). They adapt to Dark Mode and increased contrast automatically; raw hex breaks there.
|
|
31
|
-
- **Dark Mode is a first-class appearance.** Design and test both.
|
|
32
|
-
- **One tint color** drives interactive elements; decoration is not its job.
|
|
33
|
-
- **System materials** for blur and translucency behind bars and sheets; no hand-rolled glassmorphism.
|
|
34
|
-
|
|
35
|
-
## Components & controls
|
|
36
|
-
|
|
37
|
-
- **Platform controls.** Switch, segmented control, stepper, system pickers, action sheets, alerts, context menus, swipe actions. Reinventing these for flavor is the most common native slop.
|
|
38
|
-
- **SF Symbols** for iconography: baseline-aligned, Dynamic Type-aware, weight and scale variants. Don't mix in a web icon set.
|
|
39
|
-
- **Deliberate modality.** Sheet for a focused dismissible sub-task, full-screen cover for immersion. Clear Cancel/Done; honor swipe-to-dismiss unless data loss requires a guard.
|
|
40
|
-
- **Grouped/inset lists** for settings-shaped content; no bespoke card stacks.
|
|
41
|
-
|
|
42
|
-
## Motion
|
|
43
|
-
|
|
44
|
-
- **System transitions.** Push slides, sheets rise, dismiss reverses the entrance. Custom transitions that fight the navigation model disorient.
|
|
45
|
-
- **Honor Reduce Motion.** Crossfade instead of parallax and large slides.
|