quiver-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +188 -0
- package/bin/quiver-cli.mjs +2 -0
- package/dist/cli.js +3074 -0
- package/package.json +55 -0
- package/template/.agents/AGENTS.md +25 -0
- package/template/.agents/commands/cp.md +116 -0
- package/template/.agents/commands/next-setup.md +1064 -0
- package/template/.agents/commands/tf-readme.md +38 -0
- package/template/.agents/config.json +60 -0
- package/template/.agents/skills/agent-browser/SKILL.md +55 -0
- package/template/.agents/skills/apps/skybridge/SKILL.md +46 -0
- package/template/.agents/skills/apps/skybridge/references/architecture.md +175 -0
- package/template/.agents/skills/apps/skybridge/references/copy-template.md +24 -0
- package/template/.agents/skills/apps/skybridge/references/csp.md +33 -0
- package/template/.agents/skills/apps/skybridge/references/deploy.md +33 -0
- package/template/.agents/skills/apps/skybridge/references/discover.md +84 -0
- package/template/.agents/skills/apps/skybridge/references/download-file.md +77 -0
- package/template/.agents/skills/apps/skybridge/references/fetch-and-render-data.md +151 -0
- package/template/.agents/skills/apps/skybridge/references/oauth.md +115 -0
- package/template/.agents/skills/apps/skybridge/references/open-external-links.md +71 -0
- package/template/.agents/skills/apps/skybridge/references/prompt-llm.md +20 -0
- package/template/.agents/skills/apps/skybridge/references/publish.md +19 -0
- package/template/.agents/skills/apps/skybridge/references/run-locally.md +51 -0
- package/template/.agents/skills/apps/skybridge/references/state-and-context.md +151 -0
- package/template/.agents/skills/apps/skybridge/references/ui-guidelines.md +205 -0
- package/template/.agents/skills/code/cleanup/SKILL.md +26 -0
- package/template/.agents/skills/code/vercel-react-best-practices/AGENTS.md +3810 -0
- package/template/.agents/skills/code/vercel-react-best-practices/README.md +123 -0
- package/template/.agents/skills/code/vercel-react-best-practices/SKILL.md +149 -0
- package/template/.agents/skills/code/vercel-react-best-practices/metadata.json +15 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/_sections.md +46 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/_template.md +28 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/advanced-effect-event-deps.md +56 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/async-api-routes.md +38 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/async-defer-await.md +82 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/async-dependencies.md +51 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/async-parallel.md +28 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-analyzable-paths.md +63 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-barrel-imports.md +60 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-preload.md +50 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-early-exit.md +50 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-flatmap-filter.md +60 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-index-maps.md +37 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-request-idle-callback.md +105 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-activity.md +26 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-resource-hints.md +85 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-script-defer-async.md +68 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-memo.md +44 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-no-inline-components.md +82 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-use-deferred-value.md +59 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-cache-react.md +76 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-hoist-static-io.md +149 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-no-shared-module-state.md +50 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-parallel-nested-fetching.md +34 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-serialization.md +38 -0
- package/template/.agents/skills/data/prisma-cli/SKILL.md +247 -0
- package/template/.agents/skills/data/prisma-cli/references/db-execute.md +78 -0
- package/template/.agents/skills/data/prisma-cli/references/db-pull.md +185 -0
- package/template/.agents/skills/data/prisma-cli/references/db-push.md +148 -0
- package/template/.agents/skills/data/prisma-cli/references/db-seed.md +188 -0
- package/template/.agents/skills/data/prisma-cli/references/debug.md +46 -0
- package/template/.agents/skills/data/prisma-cli/references/dev.md +157 -0
- package/template/.agents/skills/data/prisma-cli/references/format.md +48 -0
- package/template/.agents/skills/data/prisma-cli/references/generate.md +173 -0
- package/template/.agents/skills/data/prisma-cli/references/init.md +136 -0
- package/template/.agents/skills/data/prisma-cli/references/mcp.md +38 -0
- package/template/.agents/skills/data/prisma-cli/references/migrate-deploy.md +127 -0
- package/template/.agents/skills/data/prisma-cli/references/migrate-dev.md +145 -0
- package/template/.agents/skills/data/prisma-cli/references/migrate-diff.md +89 -0
- package/template/.agents/skills/data/prisma-cli/references/migrate-reset.md +78 -0
- package/template/.agents/skills/data/prisma-cli/references/migrate-resolve.md +57 -0
- package/template/.agents/skills/data/prisma-cli/references/migrate-status.md +65 -0
- package/template/.agents/skills/data/prisma-cli/references/studio.md +137 -0
- package/template/.agents/skills/data/prisma-cli/references/validate.md +53 -0
- package/template/.agents/skills/data/prisma-client-api/SKILL.md +216 -0
- package/template/.agents/skills/data/prisma-client-api/references/client-methods.md +223 -0
- package/template/.agents/skills/data/prisma-client-api/references/constructor.md +208 -0
- package/template/.agents/skills/data/prisma-client-api/references/filters.md +256 -0
- package/template/.agents/skills/data/prisma-client-api/references/model-queries.md +281 -0
- package/template/.agents/skills/data/prisma-client-api/references/query-options.md +276 -0
- package/template/.agents/skills/data/prisma-client-api/references/raw-queries.md +194 -0
- package/template/.agents/skills/data/prisma-client-api/references/relations.md +308 -0
- package/template/.agents/skills/data/prisma-client-api/references/transactions.md +184 -0
- package/template/.agents/skills/design/impeccable/SKILL.md +176 -0
- package/template/.agents/skills/design/impeccable/reference/adapt.md +311 -0
- package/template/.agents/skills/design/impeccable/reference/animate.md +201 -0
- package/template/.agents/skills/design/impeccable/reference/audit.md +133 -0
- package/template/.agents/skills/design/impeccable/reference/bolder.md +113 -0
- package/template/.agents/skills/design/impeccable/reference/brand.md +108 -0
- package/template/.agents/skills/design/impeccable/reference/clarify.md +288 -0
- package/template/.agents/skills/design/impeccable/reference/codex.md +105 -0
- package/template/.agents/skills/design/impeccable/reference/colorize.md +257 -0
- package/template/.agents/skills/design/impeccable/reference/craft.md +123 -0
- package/template/.agents/skills/design/impeccable/reference/critique.md +767 -0
- package/template/.agents/skills/design/impeccable/reference/delight.md +302 -0
- package/template/.agents/skills/design/impeccable/reference/distill.md +111 -0
- package/template/.agents/skills/design/impeccable/reference/document.md +429 -0
- package/template/.agents/skills/design/impeccable/reference/extract.md +69 -0
- package/template/.agents/skills/design/impeccable/reference/harden.md +347 -0
- package/template/.agents/skills/design/impeccable/reference/init.md +172 -0
- package/template/.agents/skills/design/impeccable/reference/interaction-design.md +189 -0
- package/template/.agents/skills/design/impeccable/reference/layout.md +161 -0
- package/template/.agents/skills/design/impeccable/reference/live.md +718 -0
- package/template/.agents/skills/design/impeccable/reference/onboard.md +234 -0
- package/template/.agents/skills/design/impeccable/reference/optimize.md +258 -0
- package/template/.agents/skills/design/impeccable/reference/overdrive.md +130 -0
- package/template/.agents/skills/design/impeccable/reference/polish.md +241 -0
- package/template/.agents/skills/design/impeccable/reference/product.md +60 -0
- package/template/.agents/skills/design/impeccable/reference/quieter.md +99 -0
- package/template/.agents/skills/design/impeccable/reference/shape.md +165 -0
- package/template/.agents/skills/design/impeccable/reference/typeset.md +279 -0
- package/template/.agents/skills/design/impeccable/scripts/cleanup-deprecated.mjs +284 -0
- package/template/.agents/skills/design/impeccable/scripts/command-metadata.json +94 -0
- package/template/.agents/skills/design/impeccable/scripts/context-signals.mjs +225 -0
- package/template/.agents/skills/design/impeccable/scripts/context.mjs +270 -0
- package/template/.agents/skills/design/impeccable/scripts/critique-storage.mjs +242 -0
- package/template/.agents/skills/design/impeccable/scripts/design-parser.mjs +835 -0
- package/template/.agents/skills/design/impeccable/scripts/detect-csp.mjs +198 -0
- package/template/.agents/skills/design/impeccable/scripts/detect.mjs +21 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/browser/injected/index.mjs +1733 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/cli/main.mjs +244 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/detect-antipatterns-browser.js +4551 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/detect-antipatterns.mjs +43 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/engines/browser/detect-url.mjs +252 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/engines/regex/detect-text.mjs +535 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +986 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/engines/static-html/detect-html.mjs +208 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/engines/visual/screenshot-contrast.mjs +189 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/findings.mjs +12 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/node/file-system.mjs +198 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/profile/profiler.mjs +166 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/registry/antipatterns.mjs +419 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/rules/checks.mjs +2316 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/shared/color.mjs +124 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/shared/constants.mjs +101 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/shared/page.mjs +7 -0
- package/template/.agents/skills/design/impeccable/scripts/impeccable-paths.mjs +126 -0
- package/template/.agents/skills/design/impeccable/scripts/is-generated.mjs +69 -0
- package/template/.agents/skills/design/impeccable/scripts/live-accept.mjs +812 -0
- package/template/.agents/skills/design/impeccable/scripts/live-browser-session.js +123 -0
- package/template/.agents/skills/design/impeccable/scripts/live-browser.js +10316 -0
- package/template/.agents/skills/design/impeccable/scripts/live-commit-manual-edits.mjs +1241 -0
- package/template/.agents/skills/design/impeccable/scripts/live-complete.mjs +75 -0
- package/template/.agents/skills/design/impeccable/scripts/live-completion.mjs +19 -0
- package/template/.agents/skills/design/impeccable/scripts/live-copy-edit-agent.mjs +683 -0
- package/template/.agents/skills/design/impeccable/scripts/live-discard-manual-edits.mjs +51 -0
- package/template/.agents/skills/design/impeccable/scripts/live-event-validation.mjs +136 -0
- package/template/.agents/skills/design/impeccable/scripts/live-inject.mjs +557 -0
- package/template/.agents/skills/design/impeccable/scripts/live-insert-ui.mjs +458 -0
- package/template/.agents/skills/design/impeccable/scripts/live-insert.mjs +272 -0
- package/template/.agents/skills/design/impeccable/scripts/live-manual-edit-evidence.mjs +363 -0
- package/template/.agents/skills/design/impeccable/scripts/live-manual-edits-buffer.mjs +152 -0
- package/template/.agents/skills/design/impeccable/scripts/live-poll.mjs +379 -0
- package/template/.agents/skills/design/impeccable/scripts/live-resume.mjs +94 -0
- package/template/.agents/skills/design/impeccable/scripts/live-server.mjs +2322 -0
- package/template/.agents/skills/design/impeccable/scripts/live-session-store.mjs +289 -0
- package/template/.agents/skills/design/impeccable/scripts/live-status.mjs +61 -0
- package/template/.agents/skills/design/impeccable/scripts/live-svelte-component.mjs +826 -0
- package/template/.agents/skills/design/impeccable/scripts/live-sveltekit-adapter.mjs +274 -0
- package/template/.agents/skills/design/impeccable/scripts/live-ui-core.mjs +179 -0
- package/template/.agents/skills/design/impeccable/scripts/live-wrap.mjs +894 -0
- package/template/.agents/skills/design/impeccable/scripts/live.mjs +246 -0
- package/template/.agents/skills/design/impeccable/scripts/modern-screenshot.umd.js +14 -0
- package/template/.agents/skills/design/impeccable/scripts/palette.mjs +633 -0
- package/template/.agents/skills/design/impeccable/scripts/pin.mjs +214 -0
- package/template/.agents/skills/design/shadcn/SKILL.md +242 -0
- package/template/.agents/skills/design/shadcn/agents/openai.yml +5 -0
- 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 +257 -0
- package/template/.agents/skills/design/shadcn/customization.md +202 -0
- package/template/.agents/skills/design/shadcn/evals/evals.json +47 -0
- package/template/.agents/skills/design/shadcn/mcp.md +94 -0
- package/template/.agents/skills/design/shadcn/rules/base-vs-radix.md +306 -0
- package/template/.agents/skills/design/shadcn/rules/composition.md +195 -0
- package/template/.agents/skills/design/shadcn/rules/forms.md +192 -0
- package/template/.agents/skills/design/shadcn/rules/icons.md +101 -0
- package/template/.agents/skills/design/shadcn/rules/styling.md +162 -0
- package/template/.agents/skills/find-skills/SKILL.md +142 -0
- package/template/.agents/skills/integrations/langfuse/SKILL.md +142 -0
- package/template/.agents/skills/integrations/langfuse/references/cli.md +52 -0
- package/template/.agents/skills/integrations/langfuse/references/error-analysis.md +100 -0
- package/template/.agents/skills/integrations/langfuse/references/instrumentation.md +134 -0
- package/template/.agents/skills/integrations/langfuse/references/judge-calibration.md +288 -0
- package/template/.agents/skills/integrations/langfuse/references/prompt-migration.md +234 -0
- package/template/.agents/skills/integrations/langfuse/references/sdk-upgrade.md +175 -0
- package/template/.agents/skills/integrations/langfuse/references/skill-feedback.md +52 -0
- package/template/.agents/skills/integrations/langfuse/references/user-feedback.md +88 -0
- package/template/.agents/skills/integrations/posthog/SKILL.md +102 -0
- package/template/.agents/skills/integrations/posthog/references/error-tracking-alerts.md +63 -0
- package/template/.agents/skills/integrations/posthog/references/error-tracking-assigning-issues.md +77 -0
- package/template/.agents/skills/integrations/posthog/references/error-tracking-fingerprints.md +57 -0
- package/template/.agents/skills/integrations/posthog/references/error-tracking-monitoring.md +140 -0
- package/template/.agents/skills/integrations/posthog/references/error-tracking-nextjs.md +490 -0
- package/template/.agents/skills/integrations/posthog/references/error-tracking-source-maps.md +45 -0
- package/template/.agents/skills/integrations/posthog/references/feature-flags-best-practices.md +139 -0
- package/template/.agents/skills/integrations/posthog/references/feature-flags-react.md +302 -0
- package/template/.agents/skills/integrations/posthog/references/identify-users.md +202 -0
- package/template/.agents/skills/integrations/posthog/references/integration-example.md +706 -0
- package/template/.agents/skills/integrations/posthog/references/integration-nextjs.md +385 -0
- package/template/.agents/skills/integrations/posthog/references/integration-step-1-begin.md +43 -0
- package/template/.agents/skills/integrations/posthog/references/integration-step-2-edit.md +37 -0
- package/template/.agents/skills/integrations/posthog/references/integration-step-3-revise.md +22 -0
- package/template/.agents/skills/integrations/posthog/references/integration-step-4-conclude.md +38 -0
- package/template/.agents/skills/integrations/posthog/references/llm-analytics-anthropic.md +200 -0
- package/template/.agents/skills/integrations/posthog/references/llm-analytics-basics.md +62 -0
- package/template/.agents/skills/integrations/posthog/references/llm-analytics-costs.md +197 -0
- package/template/.agents/skills/integrations/posthog/references/llm-analytics-manual-capture.md +397 -0
- package/template/.agents/skills/integrations/posthog/references/llm-analytics-traces.md +98 -0
- package/template/.agents/skills/integrations/posthog/references/llm-analytics-vercel-ai.md +120 -0
- package/template/.agents/skills/repo/repo-ci/SKILL.md +265 -0
- package/template/.agents/skills/repo/repo-init-next-js/SKILL.md +129 -0
- package/template/.agents/skills/repo/repo-init-next-js/references/file-contents.md +800 -0
- package/template/.agents/skills/repo/repo-init-next-js/scripts/setup.sh +47 -0
- package/template/.agents/skills/repo/repo-init-node/SKILL.md +196 -0
- package/template/.agents/skills/skill-creator/LICENSE.txt +202 -0
- package/template/.agents/skills/skill-creator/SKILL.md +485 -0
- package/template/.agents/skills/skill-creator/agents/analyzer.md +274 -0
- package/template/.agents/skills/skill-creator/agents/comparator.md +202 -0
- package/template/.agents/skills/skill-creator/agents/grader.md +223 -0
- package/template/.agents/skills/skill-creator/assets/eval_review.html +146 -0
- package/template/.agents/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/template/.agents/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/template/.agents/skills/skill-creator/references/schemas.md +430 -0
- package/template/.agents/skills/skill-creator/scripts/__init__.py +0 -0
- package/template/.agents/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/template/.agents/skills/skill-creator/scripts/generate_report.py +326 -0
- package/template/.agents/skills/skill-creator/scripts/improve_description.py +247 -0
- package/template/.agents/skills/skill-creator/scripts/package_skill.py +136 -0
- package/template/.agents/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/template/.agents/skills/skill-creator/scripts/run_eval.py +310 -0
- package/template/.agents/skills/skill-creator/scripts/run_loop.py +328 -0
- package/template/.agents/skills/skill-creator/scripts/utils.py +47 -0
- package/template/.agents/upstreams.json +80 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
Typography carries most of the information on the page. Replace generic defaults (Inter, Roboto, system fallback at flat scale) with type that reflects the brand and scales with intentional contrast.
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Register
|
|
6
|
+
|
|
7
|
+
Brand: run the font selection procedure in [brand.md](brand.md). Fluid `clamp()` scale, ≥1.25 ratio between steps.
|
|
8
|
+
|
|
9
|
+
Product: system fonts and familiar sans stacks are legitimate here. One well-tuned family typically carries the whole UI. Fixed `rem` scale, 1.125–1.2 ratio between more closely-spaced steps.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Assess Current Typography
|
|
14
|
+
|
|
15
|
+
Analyze what's weak or generic about the current type:
|
|
16
|
+
|
|
17
|
+
1. **Font choices**:
|
|
18
|
+
- Are we using invisible defaults? (Inter, Roboto, Arial, Open Sans, system defaults)
|
|
19
|
+
- Does the font match the brand personality? (A playful brand shouldn't use a corporate typeface)
|
|
20
|
+
- Are there too many font families? (More than 2-3 is almost always a mess)
|
|
21
|
+
|
|
22
|
+
2. **Hierarchy**:
|
|
23
|
+
- Can you tell headings from body from captions at a glance?
|
|
24
|
+
- Are font sizes too close together? (14px, 15px, 16px = muddy hierarchy)
|
|
25
|
+
- Are weight contrasts strong enough? (Medium vs Regular is barely visible)
|
|
26
|
+
|
|
27
|
+
3. **Sizing & scale**:
|
|
28
|
+
- Is there a consistent type scale, or are sizes arbitrary?
|
|
29
|
+
- Does body text meet minimum readability? (16px+)
|
|
30
|
+
- Is the sizing strategy appropriate for the context? (Fixed `rem` scales for app UIs; fluid `clamp()` for marketing/content page headings)
|
|
31
|
+
|
|
32
|
+
4. **Readability**:
|
|
33
|
+
- Are line lengths comfortable? (45-75 characters ideal)
|
|
34
|
+
- Is line-height appropriate for the font and context?
|
|
35
|
+
- Is there enough contrast between text and background?
|
|
36
|
+
|
|
37
|
+
5. **Consistency**:
|
|
38
|
+
- Are the same elements styled the same way throughout?
|
|
39
|
+
- Are font weights used consistently? (Not bold in one section, semibold in another for the same role)
|
|
40
|
+
- Is letter-spacing intentional or default everywhere?
|
|
41
|
+
|
|
42
|
+
**CRITICAL**: The goal isn't to make text "fancier." It's to make it clearer, more readable, and more intentional. Good typography is invisible; bad typography is distracting.
|
|
43
|
+
|
|
44
|
+
## Plan Typography Improvements
|
|
45
|
+
|
|
46
|
+
Consult the [Reference Material](#reference-material) section below for detailed guidance on scales, pairing, and loading strategies.
|
|
47
|
+
|
|
48
|
+
Create a systematic plan:
|
|
49
|
+
|
|
50
|
+
- **Font selection**: Do fonts need replacing? What fits the brand/context?
|
|
51
|
+
- **Type scale**: Establish a modular scale (e.g., 1.25 ratio) with clear hierarchy
|
|
52
|
+
- **Weight strategy**: Which weights serve which roles? (Regular for body, Semibold for labels, Bold for headings, or whatever fits)
|
|
53
|
+
- **Spacing**: Line-heights, letter-spacing, and margins between typographic elements
|
|
54
|
+
|
|
55
|
+
## Improve Typography Systematically
|
|
56
|
+
|
|
57
|
+
### Font Selection
|
|
58
|
+
|
|
59
|
+
If fonts need replacing:
|
|
60
|
+
- Choose fonts that reflect the brand personality
|
|
61
|
+
- Pair with genuine contrast (serif + sans, geometric + humanist), or use a single family in multiple weights
|
|
62
|
+
- Ensure web font loading doesn't cause layout shift (`font-display: swap`, metric-matched fallbacks)
|
|
63
|
+
|
|
64
|
+
### Establish Hierarchy
|
|
65
|
+
|
|
66
|
+
Build a clear type scale:
|
|
67
|
+
- **5 sizes cover most needs**: caption, secondary, body, subheading, heading
|
|
68
|
+
- **Use a consistent ratio** between levels (1.25, 1.333, or 1.5)
|
|
69
|
+
- **Combine dimensions**: Size + weight + color + space for strong hierarchy. Don't rely on size alone
|
|
70
|
+
- **App UIs**: Use a fixed `rem`-based type scale, optionally adjusted at 1-2 breakpoints. Fluid sizing undermines the spatial predictability that dense, container-based layouts need
|
|
71
|
+
- **Marketing / content pages**: Use fluid sizing via `clamp(min, preferred, max)` for headings and display text. Keep body text fixed
|
|
72
|
+
|
|
73
|
+
### Fix Readability
|
|
74
|
+
|
|
75
|
+
- Set `max-width` on text containers using `ch` units (`max-width: 65ch`)
|
|
76
|
+
- Adjust line-height per context: tighter for headings (1.1-1.2), looser for body (1.5-1.7)
|
|
77
|
+
- Increase line-height slightly for light-on-dark text
|
|
78
|
+
- Ensure body text is at least 16px / 1rem
|
|
79
|
+
|
|
80
|
+
### Refine Details
|
|
81
|
+
|
|
82
|
+
- Use `tabular-nums` for data tables and numbers that should align
|
|
83
|
+
- Apply proper `letter-spacing`: slightly open for small caps and uppercase, default or tight for large display text
|
|
84
|
+
- Use semantic token names (`--text-body`, `--text-heading`), not value names (`--font-16`)
|
|
85
|
+
- Set `font-kerning: normal` and consider OpenType features where appropriate
|
|
86
|
+
|
|
87
|
+
### Weight Consistency
|
|
88
|
+
|
|
89
|
+
- Define clear roles for each weight and stick to them
|
|
90
|
+
- Don't use more than 3-4 weights (Regular, Medium, Semibold, Bold is plenty)
|
|
91
|
+
- Load only the weights you actually use (each weight adds to page load)
|
|
92
|
+
|
|
93
|
+
**NEVER**:
|
|
94
|
+
- Use more than 2-3 font families
|
|
95
|
+
- Pick sizes arbitrarily; commit to a scale
|
|
96
|
+
- Set body text below 16px
|
|
97
|
+
- Use decorative/display fonts for body text
|
|
98
|
+
- Disable browser zoom (`user-scalable=no`)
|
|
99
|
+
- Use `px` for font sizes; use `rem` to respect user settings
|
|
100
|
+
- Default to Inter/Roboto/Open Sans when personality matters
|
|
101
|
+
- Pair fonts that are similar but not identical (two geometric sans-serifs)
|
|
102
|
+
|
|
103
|
+
## Verify Typography Improvements
|
|
104
|
+
|
|
105
|
+
- **Hierarchy**: Can you identify heading vs body vs caption instantly?
|
|
106
|
+
- **Readability**: Is body text comfortable to read in long passages?
|
|
107
|
+
- **Consistency**: Are same-role elements styled identically throughout?
|
|
108
|
+
- **Personality**: Does the typography reflect the brand?
|
|
109
|
+
- **Performance**: Are web fonts loading efficiently without layout shift?
|
|
110
|
+
- **Accessibility**: Does text meet WCAG contrast ratios? Is it zoomable to 200%?
|
|
111
|
+
|
|
112
|
+
When the type carries the hierarchy on its own, hand off to `/impeccable polish` for the final pass.
|
|
113
|
+
|
|
114
|
+
## Live-mode signature params
|
|
115
|
+
|
|
116
|
+
Each variant MUST declare a `scale` param controlling the hierarchy ratio. Express all font sizes in the variant's scoped CSS through `calc(var(--p-scale, 1) * <base>)` or, better, scale the type ramp via `clamp(min, calc(var(--p-scale, 1) * Npx), max)`. Users slide from subdued to commanding.
|
|
117
|
+
|
|
118
|
+
```json
|
|
119
|
+
{"id":"scale","kind":"range","min":0.85,"max":1.3,"step":0.05,"default":1,"label":"Scale"}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Where the variant riffs on a specific pairing, expose the pairing choice as a `steps` param (e.g. "serif display + sans body" vs. "mono display + sans body" vs. "all-sans"). Each branch routes through `:scope[data-p-pairing="X"]` selectors in scoped CSS.
|
|
123
|
+
|
|
124
|
+
See `reference/live.md` for the full params contract.
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Reference Material
|
|
129
|
+
|
|
130
|
+
The sections below were previously `typography.md` and live inline now so the typeset flow has its deep typography reference in one place. `bolder.md` also references this section.
|
|
131
|
+
|
|
132
|
+
### Typography
|
|
133
|
+
|
|
134
|
+
#### Classic Typography Principles
|
|
135
|
+
|
|
136
|
+
##### Vertical Rhythm
|
|
137
|
+
|
|
138
|
+
Your line-height should be the base unit for ALL vertical spacing. If body text has `line-height: 1.5` on `16px` type (= 24px), spacing values should be multiples of 24px. This creates subconscious harmony; text and space share a mathematical foundation.
|
|
139
|
+
|
|
140
|
+
##### Modular Scale & Hierarchy
|
|
141
|
+
|
|
142
|
+
The common mistake: too many font sizes that are too close together (14px, 15px, 16px, 18px...). This creates muddy hierarchy.
|
|
143
|
+
|
|
144
|
+
**Use fewer sizes with more contrast.** A 5-size system covers most needs:
|
|
145
|
+
|
|
146
|
+
| Role | Typical Ratio | Use Case |
|
|
147
|
+
|------|---------------|----------|
|
|
148
|
+
| xs | 0.75rem | Captions, legal |
|
|
149
|
+
| sm | 0.875rem | Secondary UI, metadata |
|
|
150
|
+
| base | 1rem | Body text |
|
|
151
|
+
| lg | 1.25-1.5rem | Subheadings, lead text |
|
|
152
|
+
| xl+ | 2-4rem | Headlines, hero text |
|
|
153
|
+
|
|
154
|
+
Popular ratios: 1.25 (major third), 1.333 (perfect fourth), 1.5 (perfect fifth). Pick one and commit.
|
|
155
|
+
|
|
156
|
+
##### Readability & Measure
|
|
157
|
+
|
|
158
|
+
Use `ch` units for character-based measure (`max-width: 65ch`). Line-height scales inversely with line length: narrow columns need tighter leading, wide columns need more.
|
|
159
|
+
|
|
160
|
+
**Non-obvious**: Light text on dark backgrounds needs compensation on three axes, not just one. Bump line-height by 0.05–0.1, add a touch of letter-spacing (0.01–0.02em), and optionally step the body weight up one notch (regular → medium). The perceived weight drops across all three; fix all three.
|
|
161
|
+
|
|
162
|
+
**Paragraph rhythm**: Pick either space between paragraphs OR first-line indentation. Never both. Digital usually wants space; editorial/long-form can justify indent-only.
|
|
163
|
+
|
|
164
|
+
#### Font Selection & Pairing
|
|
165
|
+
|
|
166
|
+
The tactical selection procedure and the reflex-reject list live in [reference/brand.md](brand.md) under **Font selection procedure** and **Reflex-reject list** (loaded for brand-register tasks). The rest of this section covers the adjacent knowledge: anti-reflex corrections, system font use, and pairing rules.
|
|
167
|
+
|
|
168
|
+
##### Anti-reflexes worth defending against
|
|
169
|
+
|
|
170
|
+
- A technical/utilitarian brief does NOT need a serif "for warmth." Most tech tools should look like tech tools.
|
|
171
|
+
- An editorial/premium brief does NOT need the same expressive serif everyone is using right now. Premium can be Swiss-modern, can be neo-grotesque, can be a literal monospace, can be a quiet humanist sans.
|
|
172
|
+
- A children's product does NOT need a rounded display font. Kids' books use real type.
|
|
173
|
+
- A "modern" brief does NOT need a geometric sans. The most modern thing you can do is not use the font everyone else is using.
|
|
174
|
+
|
|
175
|
+
**System fonts are underrated**: `-apple-system, BlinkMacSystemFont, "Segoe UI", system-ui` looks native, loads instantly, and is highly readable. Consider this for apps where performance > personality.
|
|
176
|
+
|
|
177
|
+
##### Pairing Principles
|
|
178
|
+
|
|
179
|
+
**The non-obvious truth**: You often don't need a second font. One well-chosen font family in multiple weights creates cleaner hierarchy than two competing typefaces. Only add a second font when you need genuine contrast (e.g., display headlines + body serif).
|
|
180
|
+
|
|
181
|
+
When pairing, contrast on multiple axes:
|
|
182
|
+
- Serif + Sans (structure contrast)
|
|
183
|
+
- Geometric + Humanist (personality contrast)
|
|
184
|
+
- Condensed display + Wide body (proportion contrast)
|
|
185
|
+
|
|
186
|
+
##### Web Font Loading
|
|
187
|
+
|
|
188
|
+
The layout shift problem: fonts load late, text reflows, and users see content jump. Here's the fix:
|
|
189
|
+
|
|
190
|
+
```css
|
|
191
|
+
/* 1. Use font-display: swap for visibility */
|
|
192
|
+
@font-face {
|
|
193
|
+
font-family: 'CustomFont';
|
|
194
|
+
src: url('font.woff2') format('woff2');
|
|
195
|
+
font-display: swap;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/* 2. Match fallback metrics to minimize shift */
|
|
199
|
+
@font-face {
|
|
200
|
+
font-family: 'CustomFont-Fallback';
|
|
201
|
+
src: local('Arial');
|
|
202
|
+
size-adjust: 105%; /* Scale to match x-height */
|
|
203
|
+
ascent-override: 90%; /* Match ascender height */
|
|
204
|
+
descent-override: 20%; /* Match descender depth */
|
|
205
|
+
line-gap-override: 10%; /* Match line spacing */
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
body {
|
|
209
|
+
font-family: 'CustomFont', 'CustomFont-Fallback', sans-serif;
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
Tools like [Fontaine](https://github.com/unjs/fontaine) calculate these overrides automatically.
|
|
214
|
+
|
|
215
|
+
**`swap` vs `optional`**: `swap` shows fallback text immediately and FOUT-swaps when the web font arrives. `optional` uses the fallback if the web font misses a small load budget (~100ms) and avoids the shift entirely. Pick `optional` when zero layout shift matters more than seeing the branded font on slow networks.
|
|
216
|
+
|
|
217
|
+
**Preload the critical weight only**: typically the regular-weight body font used above the fold. Preloading every weight costs more bandwidth than it saves.
|
|
218
|
+
|
|
219
|
+
**Variable fonts for 3+ weights or styles**: a single variable font file is usually smaller than three static weight files, gives fractional weight control, and pairs well with `font-optical-sizing: auto`. For 1–2 weights, static is fine.
|
|
220
|
+
|
|
221
|
+
#### Modern Web Typography
|
|
222
|
+
|
|
223
|
+
##### Fluid Type
|
|
224
|
+
|
|
225
|
+
Fluid typography via `clamp(min, preferred, max)` scales text smoothly with the viewport. The middle value (e.g., `5vw + 1rem`) controls scaling rate (higher vw = faster scaling). Add a rem offset so it doesn't collapse to 0 on small screens.
|
|
226
|
+
|
|
227
|
+
**Use fluid type for**: Headings and display text on marketing/content pages where text dominates the layout and needs to breathe across viewport sizes.
|
|
228
|
+
|
|
229
|
+
**Use fixed `rem` scales for**: App UIs, dashboards, and data-dense interfaces. No major app design system (Material, Polaris, Primer, Carbon) uses fluid type in product UI; fixed scales with optional breakpoint adjustments give the spatial predictability that container-based layouts need. Body text should also be fixed even on marketing pages, since the size difference across viewports is too small to warrant it.
|
|
230
|
+
|
|
231
|
+
**Bound your clamp()**: keep `max-size ≤ ~2.5 × min-size`. Wider ratios break the browser's zoom and reflow behaviour and make large viewports feel like the page is shouting.
|
|
232
|
+
|
|
233
|
+
**Scale container width and font-size together** so effective character measure stays in the 45–75ch band at every viewport. A heading that widens faster than its container drifts out of the comfortable measure at the top end.
|
|
234
|
+
|
|
235
|
+
##### OpenType Features
|
|
236
|
+
|
|
237
|
+
Most developers don't know these exist. Use them for polish:
|
|
238
|
+
|
|
239
|
+
```css
|
|
240
|
+
/* Proper fractions */
|
|
241
|
+
.recipe-amount { font-variant-numeric: diagonal-fractions; }
|
|
242
|
+
|
|
243
|
+
/* Small caps for abbreviations */
|
|
244
|
+
abbr { font-variant-caps: all-small-caps; }
|
|
245
|
+
|
|
246
|
+
/* Disable ligatures in code */
|
|
247
|
+
code { font-variant-ligatures: none; }
|
|
248
|
+
|
|
249
|
+
/* Enable kerning (usually on by default, but be explicit) */
|
|
250
|
+
body { font-kerning: normal; }
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
Check what features your font supports at [Wakamai Fondue](https://wakamaifondue.com/).
|
|
254
|
+
|
|
255
|
+
##### Rendering polish
|
|
256
|
+
|
|
257
|
+
```css
|
|
258
|
+
/* Variable fonts: pick the right optical-size master automatically */
|
|
259
|
+
body { font-optical-sizing: auto; }
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
**ALL-CAPS tracking**: capitals sit too close at default spacing. Add 5–12% letter-spacing (`letter-spacing: 0.05em` to `0.12em`) to short all-caps labels, eyebrows, and small headings. Real small caps (via `font-variant-caps`) need the same treatment, slightly gentler.
|
|
263
|
+
|
|
264
|
+
#### Typography System Architecture
|
|
265
|
+
|
|
266
|
+
Name tokens semantically (`--text-body`, `--text-heading`), not by value (`--font-size-16`). Include font stacks, size scale, weights, line-heights, and letter-spacing in your token system.
|
|
267
|
+
|
|
268
|
+
#### Accessibility Considerations
|
|
269
|
+
|
|
270
|
+
Beyond contrast ratios (which are well-documented), consider:
|
|
271
|
+
|
|
272
|
+
- **Never disable zoom**: `user-scalable=no` breaks accessibility. If your layout breaks at 200% zoom, fix the layout.
|
|
273
|
+
- **Use rem/em for font sizes**: This respects user browser settings. Never `px` for body text.
|
|
274
|
+
- **Minimum 16px body text**: Smaller than this strains eyes and fails WCAG on mobile.
|
|
275
|
+
- **Adequate touch targets**: Text links need padding or line-height that creates 44px+ tap targets.
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
**Avoid**: More than 2-3 font families per project. Skipping fallback font definitions. Ignoring font loading performance (FOUT/FOIT). Using decorative fonts for body text.
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Cleans up deprecated Impeccable skill files, symlinks, and
|
|
4
|
+
* skills-lock.json entries left over from previous versions.
|
|
5
|
+
*
|
|
6
|
+
* Safe to run repeatedly -- it is a no-op when nothing needs cleaning.
|
|
7
|
+
*
|
|
8
|
+
* Usage (from the project root):
|
|
9
|
+
* node {{scripts_path}}/cleanup-deprecated.mjs
|
|
10
|
+
*
|
|
11
|
+
* What it does:
|
|
12
|
+
* 1. Finds every harness-specific skills directory (.claude/skills,
|
|
13
|
+
* .cursor/skills, .agents/skills, etc.).
|
|
14
|
+
* 2. For each deprecated skill name (with and without i- prefix),
|
|
15
|
+
* checks if the directory exists and its SKILL.md mentions
|
|
16
|
+
* "impeccable" (to avoid deleting unrelated user skills).
|
|
17
|
+
* 3. Deletes confirmed matches (files, directories, or symlinks).
|
|
18
|
+
* 4. Removes the corresponding entries from skills-lock.json.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { existsSync, readFileSync, writeFileSync, rmSync, readdirSync, statSync, lstatSync, unlinkSync } from 'node:fs';
|
|
22
|
+
import { join, resolve } from 'node:path';
|
|
23
|
+
|
|
24
|
+
// Skills that were renamed, merged, or folded in v2.0, v2.1, and v3.0.
|
|
25
|
+
const DEPRECATED_NAMES = [
|
|
26
|
+
// v2.0 renames
|
|
27
|
+
'frontend-design', // renamed to impeccable
|
|
28
|
+
'teach-impeccable', // folded into /impeccable init
|
|
29
|
+
// v2.1 merges
|
|
30
|
+
'arrange', // renamed to layout
|
|
31
|
+
'normalize', // merged into polish
|
|
32
|
+
'onboard', // merged into harden
|
|
33
|
+
'extract', // merged into /impeccable extract
|
|
34
|
+
// v3.0 consolidation: all standalone skills -> /impeccable sub-commands
|
|
35
|
+
'adapt',
|
|
36
|
+
'animate',
|
|
37
|
+
'audit',
|
|
38
|
+
'bolder',
|
|
39
|
+
'clarify',
|
|
40
|
+
'colorize',
|
|
41
|
+
'critique',
|
|
42
|
+
'delight',
|
|
43
|
+
'distill',
|
|
44
|
+
'harden',
|
|
45
|
+
'layout',
|
|
46
|
+
'optimize',
|
|
47
|
+
'overdrive',
|
|
48
|
+
'polish',
|
|
49
|
+
'quieter',
|
|
50
|
+
'shape',
|
|
51
|
+
'typeset',
|
|
52
|
+
];
|
|
53
|
+
|
|
54
|
+
// All known harness directories that may contain a skills/ subfolder.
|
|
55
|
+
const HARNESS_DIRS = [
|
|
56
|
+
'.claude', '.cursor', '.gemini', '.codex', '.agents',
|
|
57
|
+
'.trae', '.trae-cn', '.pi', '.opencode', '.kiro', '.rovodev',
|
|
58
|
+
];
|
|
59
|
+
|
|
60
|
+
// Per-skill fingerprints for SKILL.md bodies that never mentioned
|
|
61
|
+
// "impeccable" in their v2.x source. Used as a last-resort match
|
|
62
|
+
// when no skills-lock.json exists and the word heuristic fails.
|
|
63
|
+
// The strings are lifted verbatim from the v2.x frontmatter
|
|
64
|
+
// descriptions, so collisions with hand-written user skills are
|
|
65
|
+
// vanishingly unlikely.
|
|
66
|
+
const SKILL_FINGERPRINTS = {
|
|
67
|
+
harden: 'Make interfaces production-ready: error handling, empty states',
|
|
68
|
+
optimize: 'Diagnoses and fixes UI performance across loading speed',
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Walk up from startDir until we find a directory that looks like a
|
|
73
|
+
* project root (has package.json, .git, or skills-lock.json).
|
|
74
|
+
*/
|
|
75
|
+
export function findProjectRoot(startDir = process.cwd()) {
|
|
76
|
+
let dir = resolve(startDir);
|
|
77
|
+
const { root } = { root: '/' };
|
|
78
|
+
while (dir !== root) {
|
|
79
|
+
if (
|
|
80
|
+
existsSync(join(dir, 'package.json')) ||
|
|
81
|
+
existsSync(join(dir, '.git')) ||
|
|
82
|
+
existsSync(join(dir, 'skills-lock.json'))
|
|
83
|
+
) {
|
|
84
|
+
return dir;
|
|
85
|
+
}
|
|
86
|
+
const parent = resolve(dir, '..');
|
|
87
|
+
if (parent === dir) break;
|
|
88
|
+
dir = parent;
|
|
89
|
+
}
|
|
90
|
+
return resolve(startDir);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Load skills-lock.json from the project root, or null if missing/unreadable.
|
|
95
|
+
*/
|
|
96
|
+
export function loadLock(projectRoot) {
|
|
97
|
+
const lockPath = join(projectRoot, 'skills-lock.json');
|
|
98
|
+
if (!existsSync(lockPath)) return null;
|
|
99
|
+
try {
|
|
100
|
+
return JSON.parse(readFileSync(lockPath, 'utf-8'));
|
|
101
|
+
} catch {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Check whether a skill directory belongs to Impeccable. Three layered
|
|
108
|
+
* signals, in order of reliability:
|
|
109
|
+
* 1. Lock source equals "pbakaus/impeccable" (authoritative).
|
|
110
|
+
* 2. SKILL.md body contains the word "impeccable".
|
|
111
|
+
* 3. SKILL.md body contains a per-skill fingerprint (for harden and
|
|
112
|
+
* optimize, whose v2.x SKILL.md never mentioned the pack name).
|
|
113
|
+
*/
|
|
114
|
+
export function isImpeccableSkill(skillDir, { skillName, lock } = {}) {
|
|
115
|
+
// 1. Authoritative: the lock file claims this skill is ours.
|
|
116
|
+
if (skillName && lock?.skills?.[skillName]?.source === 'pbakaus/impeccable') {
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
const skillMd = join(skillDir, 'SKILL.md');
|
|
120
|
+
if (!existsSync(skillMd)) return false;
|
|
121
|
+
let content;
|
|
122
|
+
try {
|
|
123
|
+
content = readFileSync(skillMd, 'utf-8');
|
|
124
|
+
} catch {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
// 2. Word-level content heuristic.
|
|
128
|
+
if (/impeccable/i.test(content)) return true;
|
|
129
|
+
// 3. Per-skill fingerprint for old skills that never mentioned the pack.
|
|
130
|
+
// Strip the i- prefix so both `harden` and `i-harden` resolve to the
|
|
131
|
+
// same fingerprint entry.
|
|
132
|
+
const unprefixed = skillName?.startsWith('i-') ? skillName.slice(2) : skillName;
|
|
133
|
+
const fingerprint = unprefixed && SKILL_FINGERPRINTS[unprefixed];
|
|
134
|
+
if (fingerprint && content.includes(fingerprint)) return true;
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Build the full list of names to check: each deprecated name, plus
|
|
140
|
+
* its i-prefixed variant.
|
|
141
|
+
*/
|
|
142
|
+
export function buildTargetNames() {
|
|
143
|
+
const names = [];
|
|
144
|
+
for (const name of DEPRECATED_NAMES) {
|
|
145
|
+
names.push(name);
|
|
146
|
+
names.push(`i-${name}`);
|
|
147
|
+
}
|
|
148
|
+
return names;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Find every skills directory across all harness dirs in the project.
|
|
153
|
+
* Returns absolute paths that exist on disk.
|
|
154
|
+
*/
|
|
155
|
+
export function findSkillsDirs(projectRoot) {
|
|
156
|
+
const dirs = [];
|
|
157
|
+
for (const harness of HARNESS_DIRS) {
|
|
158
|
+
const candidate = join(projectRoot, harness, 'skills');
|
|
159
|
+
if (existsSync(candidate)) {
|
|
160
|
+
dirs.push(candidate);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return dirs;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Remove deprecated skill directories/symlinks from all harness dirs.
|
|
168
|
+
* Reads skills-lock.json so the authoritative "source" field can
|
|
169
|
+
* drive deletion even when SKILL.md never mentions impeccable.
|
|
170
|
+
* Returns an array of paths that were deleted.
|
|
171
|
+
*/
|
|
172
|
+
export function removeDeprecatedSkills(projectRoot, lock) {
|
|
173
|
+
if (lock === undefined) lock = loadLock(projectRoot);
|
|
174
|
+
const targets = buildTargetNames();
|
|
175
|
+
const skillsDirs = findSkillsDirs(projectRoot);
|
|
176
|
+
const deleted = [];
|
|
177
|
+
|
|
178
|
+
for (const skillsDir of skillsDirs) {
|
|
179
|
+
for (const name of targets) {
|
|
180
|
+
const skillPath = join(skillsDir, name);
|
|
181
|
+
|
|
182
|
+
// Use lstat to detect symlinks (existsSync follows symlinks and
|
|
183
|
+
// returns false for dangling ones).
|
|
184
|
+
let stat;
|
|
185
|
+
try {
|
|
186
|
+
stat = lstatSync(skillPath);
|
|
187
|
+
} catch {
|
|
188
|
+
continue; // does not exist at all
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if (stat.isSymbolicLink()) {
|
|
192
|
+
// Symlink: check the target if it's alive, otherwise treat
|
|
193
|
+
// dangling symlinks to deprecated names as safe to remove.
|
|
194
|
+
const targetAlive = existsSync(skillPath);
|
|
195
|
+
const isMatch = targetAlive
|
|
196
|
+
? isImpeccableSkill(skillPath, { skillName: name, lock })
|
|
197
|
+
: true;
|
|
198
|
+
if (isMatch) {
|
|
199
|
+
unlinkSync(skillPath);
|
|
200
|
+
deleted.push(skillPath);
|
|
201
|
+
}
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Regular directory -- verify it belongs to impeccable
|
|
206
|
+
if (isImpeccableSkill(skillPath, { skillName: name, lock })) {
|
|
207
|
+
rmSync(skillPath, { recursive: true, force: true });
|
|
208
|
+
deleted.push(skillPath);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
return deleted;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Remove deprecated entries from skills-lock.json.
|
|
218
|
+
* Only removes entries whose source is "pbakaus/impeccable".
|
|
219
|
+
* Returns the list of removed skill names.
|
|
220
|
+
*/
|
|
221
|
+
export function cleanSkillsLock(projectRoot) {
|
|
222
|
+
const lockPath = join(projectRoot, 'skills-lock.json');
|
|
223
|
+
if (!existsSync(lockPath)) return [];
|
|
224
|
+
|
|
225
|
+
let lock;
|
|
226
|
+
try {
|
|
227
|
+
lock = JSON.parse(readFileSync(lockPath, 'utf-8'));
|
|
228
|
+
} catch {
|
|
229
|
+
return [];
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
if (!lock.skills || typeof lock.skills !== 'object') return [];
|
|
233
|
+
|
|
234
|
+
const targets = buildTargetNames();
|
|
235
|
+
const removed = [];
|
|
236
|
+
|
|
237
|
+
for (const name of targets) {
|
|
238
|
+
const entry = lock.skills[name];
|
|
239
|
+
if (!entry) continue;
|
|
240
|
+
// Only remove if it belongs to impeccable
|
|
241
|
+
if (entry.source === 'pbakaus/impeccable') {
|
|
242
|
+
delete lock.skills[name];
|
|
243
|
+
removed.push(name);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
if (removed.length > 0) {
|
|
248
|
+
writeFileSync(lockPath, JSON.stringify(lock, null, 2) + '\n', 'utf-8');
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
return removed;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Run the full cleanup. Returns a summary object.
|
|
256
|
+
*
|
|
257
|
+
* Order matters: read the lock and delete directories first, then
|
|
258
|
+
* strip lock entries. Otherwise the authoritative signal is gone by
|
|
259
|
+
* the time directory deletion runs.
|
|
260
|
+
*/
|
|
261
|
+
export function cleanup(projectRoot) {
|
|
262
|
+
const root = projectRoot || findProjectRoot();
|
|
263
|
+
const lock = loadLock(root);
|
|
264
|
+
const deletedPaths = removeDeprecatedSkills(root, lock);
|
|
265
|
+
const removedLockEntries = cleanSkillsLock(root);
|
|
266
|
+
return { deletedPaths, removedLockEntries, projectRoot: root };
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// CLI entry point
|
|
270
|
+
if (process.argv[1] && resolve(process.argv[1]) === resolve(new URL(import.meta.url).pathname)) {
|
|
271
|
+
const result = cleanup();
|
|
272
|
+
if (result.deletedPaths.length === 0 && result.removedLockEntries.length === 0) {
|
|
273
|
+
console.log('No deprecated Impeccable skills found. Nothing to clean up.');
|
|
274
|
+
} else {
|
|
275
|
+
if (result.deletedPaths.length > 0) {
|
|
276
|
+
console.log(`Removed ${result.deletedPaths.length} deprecated skill(s):`);
|
|
277
|
+
for (const p of result.deletedPaths) console.log(` - ${p}`);
|
|
278
|
+
}
|
|
279
|
+
if (result.removedLockEntries.length > 0) {
|
|
280
|
+
console.log(`Cleaned ${result.removedLockEntries.length} entry/entries from skills-lock.json:`);
|
|
281
|
+
for (const name of result.removedLockEntries) console.log(` - ${name}`);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
{
|
|
2
|
+
"craft": {
|
|
3
|
+
"description": "Full confirmed-brief-then-build flow. Runs multi-round shape discovery first, resolves visual probe and north-star mock gates when available, then builds and visually iterates. Use when building a new feature end-to-end.",
|
|
4
|
+
"argumentHint": "[feature description]"
|
|
5
|
+
},
|
|
6
|
+
"init": {
|
|
7
|
+
"description": "Sets up a project for impeccable. Runs a multi-round discovery interview when context is missing and writes PRODUCT.md (strategic: users, brand, principles); offers DESIGN.md (visual: colors, typography, components) when code exists; pre-configures live mode; then recommends the best commands to run next. Every other command reads these files before doing work. Use once per project.",
|
|
8
|
+
"argumentHint": ""
|
|
9
|
+
},
|
|
10
|
+
"document": {
|
|
11
|
+
"description": "Generate a DESIGN.md file that captures the current visual design system. Auto-extracts colors, typography, spacing, radii, and component patterns from the codebase, then asks the user to confirm descriptive language for atmosphere and color character. Follows the Google Stitch DESIGN.md format so the file is tool-compatible. Use when you need a visual design spec an AI agent can follow to stay on-brand.",
|
|
12
|
+
"argumentHint": ""
|
|
13
|
+
},
|
|
14
|
+
"extract": {
|
|
15
|
+
"description": "Pull reusable patterns, components, and design tokens into the design system. Identifies repeated patterns and consolidates them. Use when you have drift across the codebase and want to bring things back to a consistent system.",
|
|
16
|
+
"argumentHint": "[target]"
|
|
17
|
+
},
|
|
18
|
+
"live": {
|
|
19
|
+
"description": "Interactive live variant mode. Select elements in the browser, pick a design action, and get AI-generated HTML+CSS variants hot-swapped via HMR. Requires a running dev server. Use when you want to visually experiment with design alternatives in real time.",
|
|
20
|
+
"argumentHint": ""
|
|
21
|
+
},
|
|
22
|
+
"adapt": {
|
|
23
|
+
"description": "Adapt designs to work across different screen sizes, devices, contexts, or platforms. Implements breakpoints, fluid layouts, and touch targets. Use when the user mentions responsive design, mobile layouts, breakpoints, viewport adaptation, or cross-device compatibility.",
|
|
24
|
+
"argumentHint": "[target] [context (mobile, tablet, print...)]"
|
|
25
|
+
},
|
|
26
|
+
"animate": {
|
|
27
|
+
"description": "Review a feature and enhance it with purposeful animations, micro-interactions, and motion effects that improve usability and delight. Use when the user mentions adding animation, transitions, micro-interactions, motion design, hover effects, or making the UI feel more alive.",
|
|
28
|
+
"argumentHint": "[target]"
|
|
29
|
+
},
|
|
30
|
+
"audit": {
|
|
31
|
+
"description": "Run technical quality checks across accessibility, performance, theming, responsive design, and anti-patterns. Generates a scored report with P0-P3 severity ratings and actionable plan. Use when the user wants an accessibility check, performance audit, or technical quality review.",
|
|
32
|
+
"argumentHint": "[area (feature, page, component...)]"
|
|
33
|
+
},
|
|
34
|
+
"bolder": {
|
|
35
|
+
"description": "Amplify safe or boring designs to make them more visually interesting and stimulating. Increases impact while maintaining usability. Use when the user says the design looks bland, generic, too safe, lacks personality, or wants more visual impact and character.",
|
|
36
|
+
"argumentHint": "[target]"
|
|
37
|
+
},
|
|
38
|
+
"clarify": {
|
|
39
|
+
"description": "Improve unclear UX copy, error messages, microcopy, labels, and instructions to make interfaces easier to understand. Use when the user mentions confusing text, unclear labels, bad error messages, hard-to-follow instructions, or wanting better UX writing.",
|
|
40
|
+
"argumentHint": "[target]"
|
|
41
|
+
},
|
|
42
|
+
"colorize": {
|
|
43
|
+
"description": "Add strategic color to features that are too monochromatic or lack visual interest, making interfaces more engaging and expressive. Use when the user mentions the design looking gray, dull, lacking warmth, needing more color, or wanting a more vibrant or expressive palette.",
|
|
44
|
+
"argumentHint": "[target]"
|
|
45
|
+
},
|
|
46
|
+
"critique": {
|
|
47
|
+
"description": "Evaluate design from a UX perspective, assessing visual hierarchy, information architecture, emotional resonance, cognitive load, and overall quality with quantitative scoring, persona-based testing, automated anti-pattern detection, and actionable feedback. Use when the user asks to review, critique, evaluate, or give feedback on a design or component.",
|
|
48
|
+
"argumentHint": "[area (feature, page, component...)]"
|
|
49
|
+
},
|
|
50
|
+
"delight": {
|
|
51
|
+
"description": "Add moments of joy, personality, and unexpected touches that make interfaces memorable and enjoyable to use. Elevates functional to delightful. Use when the user asks to add polish, personality, animations, micro-interactions, delight, or make an interface feel fun or memorable.",
|
|
52
|
+
"argumentHint": "[target]"
|
|
53
|
+
},
|
|
54
|
+
"distill": {
|
|
55
|
+
"description": "Strip designs to their essence by removing unnecessary complexity. Great design is simple, powerful, and clean. Use when the user asks to simplify, declutter, reduce noise, remove elements, or make a UI cleaner and more focused.",
|
|
56
|
+
"argumentHint": "[target]"
|
|
57
|
+
},
|
|
58
|
+
"harden": {
|
|
59
|
+
"description": "Make interfaces production-ready: error handling, i18n, text overflow, edge case management, and resilience under real-world data. Use when the user asks to harden, make production-ready, handle edge cases, add error states, or fix overflow and i18n issues.",
|
|
60
|
+
"argumentHint": "[target]"
|
|
61
|
+
},
|
|
62
|
+
"onboard": {
|
|
63
|
+
"description": "Design onboarding flows, first-run experiences, and empty states that guide new users to value. Covers welcome screens, account setup, progressive disclosure, contextual tooltips, feature announcements, and activation moments. Use when the user mentions onboarding, first-time users, empty states, activation, getting started, new user flows, or the aha moment.",
|
|
64
|
+
"argumentHint": "[target]"
|
|
65
|
+
},
|
|
66
|
+
"layout": {
|
|
67
|
+
"description": "Improve layout, spacing, and visual rhythm. Fixes monotonous grids, inconsistent spacing, and weak visual hierarchy. Use when the user mentions layout feeling off, spacing issues, visual hierarchy, crowded UI, alignment problems, or wanting better composition.",
|
|
68
|
+
"argumentHint": "[target]"
|
|
69
|
+
},
|
|
70
|
+
"optimize": {
|
|
71
|
+
"description": "Diagnoses and fixes UI performance across loading speed, rendering, animations, images, and bundle size. Use when the user mentions slow, laggy, janky, performance, bundle size, load time, or wants a faster, smoother experience.",
|
|
72
|
+
"argumentHint": "[target]"
|
|
73
|
+
},
|
|
74
|
+
"overdrive": {
|
|
75
|
+
"description": "Pushes interfaces past conventional limits with technically ambitious implementations — shaders, spring physics, scroll-driven reveals, 60fps animations. Use when the user wants to wow, impress, go all-out, or make something that feels extraordinary.",
|
|
76
|
+
"argumentHint": "[target]"
|
|
77
|
+
},
|
|
78
|
+
"polish": {
|
|
79
|
+
"description": "Performs a final quality pass fixing alignment, spacing, consistency, and micro-detail issues before shipping. Use when the user mentions polish, finishing touches, pre-launch review, something looks off, or wants to go from good to great.",
|
|
80
|
+
"argumentHint": "[target]"
|
|
81
|
+
},
|
|
82
|
+
"quieter": {
|
|
83
|
+
"description": "Tones down visually aggressive or overstimulating designs, reducing intensity while preserving quality. Use when the user mentions too bold, too loud, overwhelming, aggressive, garish, or wants a calmer, more refined aesthetic.",
|
|
84
|
+
"argumentHint": "[target]"
|
|
85
|
+
},
|
|
86
|
+
"shape": {
|
|
87
|
+
"description": "Plan UX and UI before code. Runs a required multi-round discovery interview, uses visual probes when available, and produces a user-confirmed design brief for implementation.",
|
|
88
|
+
"argumentHint": "[feature to shape]"
|
|
89
|
+
},
|
|
90
|
+
"typeset": {
|
|
91
|
+
"description": "Improves typography by fixing font choices, hierarchy, sizing, weight, and readability so text feels intentional. Use when the user mentions fonts, type, readability, text hierarchy, sizing looks off, or wants more polished, intentional typography.",
|
|
92
|
+
"argumentHint": "[target]"
|
|
93
|
+
}
|
|
94
|
+
}
|