quiver-cli 1.3.1 → 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.
Files changed (407) hide show
  1. package/README.md +197 -239
  2. package/dist/cli.js +3163 -2040
  3. package/package.json +10 -11
  4. package/template/.agents/AGENTS.md +0 -26
  5. package/template/.agents/commands/cp.md +0 -108
  6. package/template/.agents/commands/next-setup.md +0 -1064
  7. package/template/.agents/commands/review.md +0 -68
  8. package/template/.agents/commands/terraform-readme.md +0 -38
  9. package/template/.agents/config.json +0 -80
  10. package/template/.agents/plugins/opencode/rtk.ts +0 -34
  11. package/template/.agents/skills/agent-browser/SKILL.md +0 -52
  12. package/template/.agents/skills/apps/skybridge/SKILL.md +0 -52
  13. package/template/.agents/skills/code/cleanup/SKILL.md +0 -26
  14. package/template/.agents/skills/code/improve/SKILL.md +0 -122
  15. package/template/.agents/skills/code/improve/references/audit-playbook.md +0 -130
  16. package/template/.agents/skills/code/improve/references/closing-the-loop.md +0 -96
  17. package/template/.agents/skills/code/improve/references/plan-template.md +0 -197
  18. package/template/.agents/skills/code/vercel-react-best-practices/AGENTS.md +0 -3810
  19. package/template/.agents/skills/code/vercel-react-best-practices/README.md +0 -123
  20. package/template/.agents/skills/code/vercel-react-best-practices/SKILL.md +0 -149
  21. package/template/.agents/skills/code/vercel-react-best-practices/metadata.json +0 -15
  22. package/template/.agents/skills/code/vercel-react-best-practices/rules/_sections.md +0 -46
  23. package/template/.agents/skills/code/vercel-react-best-practices/rules/_template.md +0 -28
  24. package/template/.agents/skills/code/vercel-react-best-practices/rules/advanced-effect-event-deps.md +0 -56
  25. package/template/.agents/skills/code/vercel-react-best-practices/rules/advanced-event-handler-refs.md +0 -55
  26. package/template/.agents/skills/code/vercel-react-best-practices/rules/advanced-init-once.md +0 -42
  27. package/template/.agents/skills/code/vercel-react-best-practices/rules/advanced-use-latest.md +0 -39
  28. package/template/.agents/skills/code/vercel-react-best-practices/rules/async-api-routes.md +0 -38
  29. package/template/.agents/skills/code/vercel-react-best-practices/rules/async-cheap-condition-before-await.md +0 -37
  30. package/template/.agents/skills/code/vercel-react-best-practices/rules/async-defer-await.md +0 -82
  31. package/template/.agents/skills/code/vercel-react-best-practices/rules/async-dependencies.md +0 -51
  32. package/template/.agents/skills/code/vercel-react-best-practices/rules/async-parallel.md +0 -28
  33. package/template/.agents/skills/code/vercel-react-best-practices/rules/async-suspense-boundaries.md +0 -99
  34. package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-analyzable-paths.md +0 -63
  35. package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-barrel-imports.md +0 -60
  36. package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-conditional.md +0 -31
  37. package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-defer-third-party.md +0 -49
  38. package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-dynamic-imports.md +0 -35
  39. package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-preload.md +0 -50
  40. package/template/.agents/skills/code/vercel-react-best-practices/rules/client-event-listeners.md +0 -74
  41. package/template/.agents/skills/code/vercel-react-best-practices/rules/client-localstorage-schema.md +0 -71
  42. package/template/.agents/skills/code/vercel-react-best-practices/rules/client-passive-event-listeners.md +0 -48
  43. package/template/.agents/skills/code/vercel-react-best-practices/rules/client-swr-dedup.md +0 -56
  44. package/template/.agents/skills/code/vercel-react-best-practices/rules/js-batch-dom-css.md +0 -107
  45. package/template/.agents/skills/code/vercel-react-best-practices/rules/js-cache-function-results.md +0 -80
  46. package/template/.agents/skills/code/vercel-react-best-practices/rules/js-cache-property-access.md +0 -28
  47. package/template/.agents/skills/code/vercel-react-best-practices/rules/js-cache-storage.md +0 -70
  48. package/template/.agents/skills/code/vercel-react-best-practices/rules/js-combine-iterations.md +0 -32
  49. package/template/.agents/skills/code/vercel-react-best-practices/rules/js-early-exit.md +0 -50
  50. package/template/.agents/skills/code/vercel-react-best-practices/rules/js-flatmap-filter.md +0 -60
  51. package/template/.agents/skills/code/vercel-react-best-practices/rules/js-hoist-regexp.md +0 -45
  52. package/template/.agents/skills/code/vercel-react-best-practices/rules/js-index-maps.md +0 -37
  53. package/template/.agents/skills/code/vercel-react-best-practices/rules/js-length-check-first.md +0 -49
  54. package/template/.agents/skills/code/vercel-react-best-practices/rules/js-min-max-loop.md +0 -82
  55. package/template/.agents/skills/code/vercel-react-best-practices/rules/js-request-idle-callback.md +0 -105
  56. package/template/.agents/skills/code/vercel-react-best-practices/rules/js-set-map-lookups.md +0 -24
  57. package/template/.agents/skills/code/vercel-react-best-practices/rules/js-tosorted-immutable.md +0 -57
  58. package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-activity.md +0 -26
  59. package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
  60. package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-conditional-render.md +0 -40
  61. package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-content-visibility.md +0 -38
  62. package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-hoist-jsx.md +0 -46
  63. package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
  64. package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +0 -30
  65. package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-resource-hints.md +0 -85
  66. package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-script-defer-async.md +0 -68
  67. package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-svg-precision.md +0 -28
  68. package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-usetransition-loading.md +0 -75
  69. package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-defer-reads.md +0 -39
  70. package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-dependencies.md +0 -45
  71. package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +0 -40
  72. package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-derived-state.md +0 -29
  73. package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-functional-setstate.md +0 -74
  74. package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-lazy-state-init.md +0 -58
  75. package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +0 -38
  76. package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-memo.md +0 -44
  77. package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +0 -45
  78. package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-no-inline-components.md +0 -82
  79. package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -35
  80. package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +0 -64
  81. package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-transitions.md +0 -40
  82. package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-use-deferred-value.md +0 -59
  83. package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +0 -73
  84. package/template/.agents/skills/code/vercel-react-best-practices/rules/server-after-nonblocking.md +0 -73
  85. package/template/.agents/skills/code/vercel-react-best-practices/rules/server-auth-actions.md +0 -96
  86. package/template/.agents/skills/code/vercel-react-best-practices/rules/server-cache-lru.md +0 -41
  87. package/template/.agents/skills/code/vercel-react-best-practices/rules/server-cache-react.md +0 -76
  88. package/template/.agents/skills/code/vercel-react-best-practices/rules/server-dedup-props.md +0 -65
  89. package/template/.agents/skills/code/vercel-react-best-practices/rules/server-hoist-static-io.md +0 -149
  90. package/template/.agents/skills/code/vercel-react-best-practices/rules/server-no-shared-module-state.md +0 -50
  91. package/template/.agents/skills/code/vercel-react-best-practices/rules/server-parallel-fetching.md +0 -83
  92. package/template/.agents/skills/code/vercel-react-best-practices/rules/server-parallel-nested-fetching.md +0 -34
  93. package/template/.agents/skills/code/vercel-react-best-practices/rules/server-serialization.md +0 -38
  94. package/template/.agents/skills/data/prisma-cli/SKILL.md +0 -265
  95. package/template/.agents/skills/data/prisma-cli/references/agent-safety.md +0 -27
  96. package/template/.agents/skills/data/prisma-cli/references/complete.md +0 -22
  97. package/template/.agents/skills/data/prisma-cli/references/db-execute.md +0 -78
  98. package/template/.agents/skills/data/prisma-cli/references/db-pull.md +0 -185
  99. package/template/.agents/skills/data/prisma-cli/references/db-push.md +0 -150
  100. package/template/.agents/skills/data/prisma-cli/references/db-seed.md +0 -188
  101. package/template/.agents/skills/data/prisma-cli/references/debug.md +0 -46
  102. package/template/.agents/skills/data/prisma-cli/references/dev.md +0 -157
  103. package/template/.agents/skills/data/prisma-cli/references/format.md +0 -48
  104. package/template/.agents/skills/data/prisma-cli/references/generate.md +0 -173
  105. package/template/.agents/skills/data/prisma-cli/references/init.md +0 -139
  106. package/template/.agents/skills/data/prisma-cli/references/mcp.md +0 -39
  107. package/template/.agents/skills/data/prisma-cli/references/migrate-deploy.md +0 -127
  108. package/template/.agents/skills/data/prisma-cli/references/migrate-dev.md +0 -145
  109. package/template/.agents/skills/data/prisma-cli/references/migrate-diff.md +0 -89
  110. package/template/.agents/skills/data/prisma-cli/references/migrate-reset.md +0 -80
  111. package/template/.agents/skills/data/prisma-cli/references/migrate-resolve.md +0 -57
  112. package/template/.agents/skills/data/prisma-cli/references/migrate-status.md +0 -65
  113. package/template/.agents/skills/data/prisma-cli/references/studio.md +0 -137
  114. package/template/.agents/skills/data/prisma-cli/references/validate.md +0 -53
  115. package/template/.agents/skills/data/prisma-client-api/SKILL.md +0 -216
  116. package/template/.agents/skills/data/prisma-client-api/references/client-methods.md +0 -223
  117. package/template/.agents/skills/data/prisma-client-api/references/constructor.md +0 -221
  118. package/template/.agents/skills/data/prisma-client-api/references/filters.md +0 -256
  119. package/template/.agents/skills/data/prisma-client-api/references/model-queries.md +0 -281
  120. package/template/.agents/skills/data/prisma-client-api/references/query-options.md +0 -276
  121. package/template/.agents/skills/data/prisma-client-api/references/raw-queries.md +0 -198
  122. package/template/.agents/skills/data/prisma-client-api/references/relations.md +0 -308
  123. package/template/.agents/skills/data/prisma-client-api/references/transactions.md +0 -184
  124. package/template/.agents/skills/design/impeccable/SKILL.md +0 -84
  125. package/template/.agents/skills/design/impeccable/reference/adapt.md +0 -312
  126. package/template/.agents/skills/design/impeccable/reference/adapt.native.md +0 -58
  127. package/template/.agents/skills/design/impeccable/reference/android.md +0 -46
  128. package/template/.agents/skills/design/impeccable/reference/animate.md +0 -89
  129. package/template/.agents/skills/design/impeccable/reference/audit.md +0 -136
  130. package/template/.agents/skills/design/impeccable/reference/audit.native.md +0 -139
  131. package/template/.agents/skills/design/impeccable/reference/bolder.md +0 -33
  132. package/template/.agents/skills/design/impeccable/reference/clarify.md +0 -94
  133. package/template/.agents/skills/design/impeccable/reference/colorize.md +0 -86
  134. package/template/.agents/skills/design/impeccable/reference/craft-floor.md +0 -44
  135. package/template/.agents/skills/design/impeccable/reference/craft.md +0 -5
  136. package/template/.agents/skills/design/impeccable/reference/critique.md +0 -806
  137. package/template/.agents/skills/design/impeccable/reference/degraded/asset-producer.md +0 -37
  138. package/template/.agents/skills/design/impeccable/reference/degraded/documenter.md +0 -24
  139. package/template/.agents/skills/design/impeccable/reference/degraded/finish-reviewer.md +0 -38
  140. package/template/.agents/skills/design/impeccable/reference/degraded/manual-edit-applier.md +0 -92
  141. package/template/.agents/skills/design/impeccable/reference/delight.md +0 -70
  142. package/template/.agents/skills/design/impeccable/reference/distill.md +0 -111
  143. package/template/.agents/skills/design/impeccable/reference/doctor.md +0 -54
  144. package/template/.agents/skills/design/impeccable/reference/document.md +0 -416
  145. package/template/.agents/skills/design/impeccable/reference/extract.md +0 -69
  146. package/template/.agents/skills/design/impeccable/reference/harden.md +0 -336
  147. package/template/.agents/skills/design/impeccable/reference/hooks.md +0 -111
  148. package/template/.agents/skills/design/impeccable/reference/init.md +0 -131
  149. package/template/.agents/skills/design/impeccable/reference/ios.md +0 -51
  150. package/template/.agents/skills/design/impeccable/reference/layout.md +0 -84
  151. package/template/.agents/skills/design/impeccable/reference/live-setup.md +0 -102
  152. package/template/.agents/skills/design/impeccable/reference/live.md +0 -323
  153. package/template/.agents/skills/design/impeccable/reference/new-work.md +0 -145
  154. package/template/.agents/skills/design/impeccable/reference/onboard.md +0 -234
  155. package/template/.agents/skills/design/impeccable/reference/operate.md +0 -61
  156. package/template/.agents/skills/design/impeccable/reference/optimize.md +0 -258
  157. package/template/.agents/skills/design/impeccable/reference/overdrive.md +0 -127
  158. package/template/.agents/skills/design/impeccable/reference/polish.md +0 -105
  159. package/template/.agents/skills/design/impeccable/reference/quieter.md +0 -99
  160. package/template/.agents/skills/design/impeccable/reference/routing.md +0 -18
  161. package/template/.agents/skills/design/impeccable/reference/shape.md +0 -59
  162. package/template/.agents/skills/design/impeccable/reference/typeset.md +0 -80
  163. package/template/.agents/skills/design/impeccable/reference/visualize.md +0 -46
  164. package/template/.agents/skills/design/impeccable/scripts/build-phase.mjs +0 -1022
  165. package/template/.agents/skills/design/impeccable/scripts/command-metadata.json +0 -94
  166. package/template/.agents/skills/design/impeccable/scripts/comp-diff.mjs +0 -391
  167. package/template/.agents/skills/design/impeccable/scripts/comp-spec.mjs +0 -513
  168. package/template/.agents/skills/design/impeccable/scripts/concept-seed.mjs +0 -814
  169. package/template/.agents/skills/design/impeccable/scripts/context-signals.mjs +0 -325
  170. package/template/.agents/skills/design/impeccable/scripts/context.mjs +0 -1565
  171. package/template/.agents/skills/design/impeccable/scripts/critique-storage.mjs +0 -473
  172. package/template/.agents/skills/design/impeccable/scripts/data/font-index-failures.json +0 -121
  173. package/template/.agents/skills/design/impeccable/scripts/data/font-index.json +0 -1
  174. package/template/.agents/skills/design/impeccable/scripts/detect-csp.mjs +0 -198
  175. package/template/.agents/skills/design/impeccable/scripts/detect.mjs +0 -30
  176. package/template/.agents/skills/design/impeccable/scripts/detector/browser/injected/index.mjs +0 -2204
  177. package/template/.agents/skills/design/impeccable/scripts/detector/cli/main.mjs +0 -432
  178. package/template/.agents/skills/design/impeccable/scripts/detector/design-system.mjs +0 -1311
  179. package/template/.agents/skills/design/impeccable/scripts/detector/detect-antipatterns-browser.js +0 -9043
  180. package/template/.agents/skills/design/impeccable/scripts/detector/detect-antipatterns.mjs +0 -51
  181. package/template/.agents/skills/design/impeccable/scripts/detector/engines/browser/detect-url.mjs +0 -434
  182. package/template/.agents/skills/design/impeccable/scripts/detector/engines/regex/detect-text.mjs +0 -1319
  183. package/template/.agents/skills/design/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +0 -1241
  184. package/template/.agents/skills/design/impeccable/scripts/detector/engines/static-html/detect-html.mjs +0 -288
  185. package/template/.agents/skills/design/impeccable/scripts/detector/engines/visual/screenshot-contrast.mjs +0 -189
  186. package/template/.agents/skills/design/impeccable/scripts/detector/findings.mjs +0 -18
  187. package/template/.agents/skills/design/impeccable/scripts/detector/node/file-system.mjs +0 -213
  188. package/template/.agents/skills/design/impeccable/scripts/detector/profile/profiler.mjs +0 -166
  189. package/template/.agents/skills/design/impeccable/scripts/detector/registry/antipatterns.mjs +0 -635
  190. package/template/.agents/skills/design/impeccable/scripts/detector/rules/checks.mjs +0 -5681
  191. package/template/.agents/skills/design/impeccable/scripts/detector/shared/color.mjs +0 -596
  192. package/template/.agents/skills/design/impeccable/scripts/detector/shared/constants.mjs +0 -127
  193. package/template/.agents/skills/design/impeccable/scripts/detector/shared/fonts.mjs +0 -30
  194. package/template/.agents/skills/design/impeccable/scripts/detector/shared/inline-ignores.mjs +0 -148
  195. package/template/.agents/skills/design/impeccable/scripts/detector/shared/page.mjs +0 -7
  196. package/template/.agents/skills/design/impeccable/scripts/doctor.mjs +0 -329
  197. package/template/.agents/skills/design/impeccable/scripts/embed-prompt.mjs +0 -166
  198. package/template/.agents/skills/design/impeccable/scripts/font-match.mjs +0 -457
  199. package/template/.agents/skills/design/impeccable/scripts/generate-image.mjs +0 -447
  200. package/template/.agents/skills/design/impeccable/scripts/hook-admin.mjs +0 -819
  201. package/template/.agents/skills/design/impeccable/scripts/hook-before-edit.mjs +0 -538
  202. package/template/.agents/skills/design/impeccable/scripts/hook-lib.mjs +0 -2490
  203. package/template/.agents/skills/design/impeccable/scripts/hook.mjs +0 -79
  204. package/template/.agents/skills/design/impeccable/scripts/lib/artifact-schema.mjs +0 -93
  205. package/template/.agents/skills/design/impeccable/scripts/lib/composition-catalog.mjs +0 -200
  206. package/template/.agents/skills/design/impeccable/scripts/lib/concept-catalog.mjs +0 -396
  207. package/template/.agents/skills/design/impeccable/scripts/lib/design-parser.mjs +0 -880
  208. package/template/.agents/skills/design/impeccable/scripts/lib/font-fingerprint.mjs +0 -564
  209. package/template/.agents/skills/design/impeccable/scripts/lib/font-index.mjs +0 -130
  210. package/template/.agents/skills/design/impeccable/scripts/lib/hero-checks.mjs +0 -246
  211. package/template/.agents/skills/design/impeccable/scripts/lib/image-metrics.mjs +0 -306
  212. package/template/.agents/skills/design/impeccable/scripts/lib/impeccable-config.mjs +0 -640
  213. package/template/.agents/skills/design/impeccable/scripts/lib/impeccable-paths.mjs +0 -137
  214. package/template/.agents/skills/design/impeccable/scripts/lib/is-generated.mjs +0 -72
  215. package/template/.agents/skills/design/impeccable/scripts/lib/live-path-globs.mjs +0 -37
  216. package/template/.agents/skills/design/impeccable/scripts/lib/open-system-browser.mjs +0 -26
  217. package/template/.agents/skills/design/impeccable/scripts/lib/png.mjs +0 -281
  218. package/template/.agents/skills/design/impeccable/scripts/lib/provider.mjs +0 -5
  219. package/template/.agents/skills/design/impeccable/scripts/lib/raster.mjs +0 -194
  220. package/template/.agents/skills/design/impeccable/scripts/lib/roll-selection.mjs +0 -369
  221. package/template/.agents/skills/design/impeccable/scripts/lib/staleness-deep.mjs +0 -485
  222. package/template/.agents/skills/design/impeccable/scripts/lib/staleness-notice.mjs +0 -169
  223. package/template/.agents/skills/design/impeccable/scripts/lib/staleness.mjs +0 -533
  224. package/template/.agents/skills/design/impeccable/scripts/lib/surface-briefs.mjs +0 -149
  225. package/template/.agents/skills/design/impeccable/scripts/lib/target-args.mjs +0 -42
  226. package/template/.agents/skills/design/impeccable/scripts/lib/target-slug.mjs +0 -33
  227. package/template/.agents/skills/design/impeccable/scripts/lib/template-extensions.mjs +0 -146
  228. package/template/.agents/skills/design/impeccable/scripts/live/accept-css.mjs +0 -617
  229. package/template/.agents/skills/design/impeccable/scripts/live/accept-verify.mjs +0 -60
  230. package/template/.agents/skills/design/impeccable/scripts/live/browser-script-parts.mjs +0 -84
  231. package/template/.agents/skills/design/impeccable/scripts/live/completion.mjs +0 -28
  232. package/template/.agents/skills/design/impeccable/scripts/live/event-validation.mjs +0 -199
  233. package/template/.agents/skills/design/impeccable/scripts/live/frameworks/astro.mjs +0 -47
  234. package/template/.agents/skills/design/impeccable/scripts/live/frameworks/detect-utils.mjs +0 -73
  235. package/template/.agents/skills/design/impeccable/scripts/live/frameworks/index.mjs +0 -143
  236. package/template/.agents/skills/design/impeccable/scripts/live/frameworks/journal.mjs +0 -197
  237. package/template/.agents/skills/design/impeccable/scripts/live/frameworks/nextjs.mjs +0 -49
  238. package/template/.agents/skills/design/impeccable/scripts/live/frameworks/nuxt.mjs +0 -161
  239. package/template/.agents/skills/design/impeccable/scripts/live/frameworks/script-src.mjs +0 -17
  240. package/template/.agents/skills/design/impeccable/scripts/live/frameworks/static-html.mjs +0 -26
  241. package/template/.agents/skills/design/impeccable/scripts/live/frameworks/sveltekit.mjs +0 -71
  242. package/template/.agents/skills/design/impeccable/scripts/live/frameworks/tag-strategy.mjs +0 -247
  243. package/template/.agents/skills/design/impeccable/scripts/live/frameworks/tanstack-start.mjs +0 -70
  244. package/template/.agents/skills/design/impeccable/scripts/live/frameworks/vite-generic.mjs +0 -42
  245. package/template/.agents/skills/design/impeccable/scripts/live/generation-preflight.mjs +0 -149
  246. package/template/.agents/skills/design/impeccable/scripts/live/insert-ui.mjs +0 -458
  247. package/template/.agents/skills/design/impeccable/scripts/live/instructions.mjs +0 -142
  248. package/template/.agents/skills/design/impeccable/scripts/live/manual-apply.mjs +0 -939
  249. package/template/.agents/skills/design/impeccable/scripts/live/manual-edit-routes.mjs +0 -357
  250. package/template/.agents/skills/design/impeccable/scripts/live/manual-edits-buffer.mjs +0 -152
  251. package/template/.agents/skills/design/impeccable/scripts/live/poll-lanes.mjs +0 -14
  252. package/template/.agents/skills/design/impeccable/scripts/live/project-ignores.mjs +0 -139
  253. package/template/.agents/skills/design/impeccable/scripts/live/roots.mjs +0 -508
  254. package/template/.agents/skills/design/impeccable/scripts/live/session-store.mjs +0 -563
  255. package/template/.agents/skills/design/impeccable/scripts/live/source-lock.mjs +0 -105
  256. package/template/.agents/skills/design/impeccable/scripts/live/source-search.mjs +0 -105
  257. package/template/.agents/skills/design/impeccable/scripts/live/svelte-ast.mjs +0 -969
  258. package/template/.agents/skills/design/impeccable/scripts/live/svelte-component.mjs +0 -1366
  259. package/template/.agents/skills/design/impeccable/scripts/live/sveltekit-adapter.mjs +0 -304
  260. package/template/.agents/skills/design/impeccable/scripts/live/tanstack-adapter.mjs +0 -259
  261. package/template/.agents/skills/design/impeccable/scripts/live/ui-surfaces.mjs +0 -75
  262. package/template/.agents/skills/design/impeccable/scripts/live/vocabulary.mjs +0 -171
  263. package/template/.agents/skills/design/impeccable/scripts/live-accept.mjs +0 -938
  264. package/template/.agents/skills/design/impeccable/scripts/live-browser-dom.js +0 -146
  265. package/template/.agents/skills/design/impeccable/scripts/live-browser-ignores.js +0 -242
  266. package/template/.agents/skills/design/impeccable/scripts/live-browser-session.js +0 -123
  267. package/template/.agents/skills/design/impeccable/scripts/live-browser.js +0 -12551
  268. package/template/.agents/skills/design/impeccable/scripts/live-commit-manual-edits.mjs +0 -1200
  269. package/template/.agents/skills/design/impeccable/scripts/live-complete.mjs +0 -107
  270. package/template/.agents/skills/design/impeccable/scripts/live-copy-edit-agent.mjs +0 -800
  271. package/template/.agents/skills/design/impeccable/scripts/live-discard-manual-edits.mjs +0 -51
  272. package/template/.agents/skills/design/impeccable/scripts/live-inject.mjs +0 -463
  273. package/template/.agents/skills/design/impeccable/scripts/live-insert.mjs +0 -292
  274. package/template/.agents/skills/design/impeccable/scripts/live-manual-edit-evidence.mjs +0 -368
  275. package/template/.agents/skills/design/impeccable/scripts/live-poll.mjs +0 -430
  276. package/template/.agents/skills/design/impeccable/scripts/live-resume.mjs +0 -123
  277. package/template/.agents/skills/design/impeccable/scripts/live-server.mjs +0 -1698
  278. package/template/.agents/skills/design/impeccable/scripts/live-status.mjs +0 -71
  279. package/template/.agents/skills/design/impeccable/scripts/live-target.mjs +0 -30
  280. package/template/.agents/skills/design/impeccable/scripts/live-wrap.mjs +0 -927
  281. package/template/.agents/skills/design/impeccable/scripts/live.mjs +0 -334
  282. package/template/.agents/skills/design/impeccable/scripts/modern-screenshot.umd.js +0 -14
  283. package/template/.agents/skills/design/impeccable/scripts/palette.mjs +0 -628
  284. package/template/.agents/skills/design/impeccable/scripts/pin.mjs +0 -224
  285. package/template/.agents/skills/design/impeccable/scripts/serve-question.mjs +0 -1783
  286. package/template/.agents/skills/design/impeccable/scripts/surface-brief.mjs +0 -74
  287. package/template/.agents/skills/design/shadcn/SKILL.md +0 -277
  288. package/template/.agents/skills/design/shadcn/agents/openai.yml +0 -5
  289. package/template/.agents/skills/design/shadcn/assets/shadcn-small.png +0 -0
  290. package/template/.agents/skills/design/shadcn/assets/shadcn.png +0 -0
  291. package/template/.agents/skills/design/shadcn/cli.md +0 -290
  292. package/template/.agents/skills/design/shadcn/customization.md +0 -209
  293. package/template/.agents/skills/design/shadcn/evals/evals.json +0 -77
  294. package/template/.agents/skills/design/shadcn/mcp.md +0 -105
  295. package/template/.agents/skills/design/shadcn/registry.md +0 -277
  296. package/template/.agents/skills/design/shadcn/rules/base-vs-radix.md +0 -306
  297. package/template/.agents/skills/design/shadcn/rules/chat.md +0 -250
  298. package/template/.agents/skills/design/shadcn/rules/composition.md +0 -213
  299. package/template/.agents/skills/design/shadcn/rules/forms.md +0 -192
  300. package/template/.agents/skills/design/shadcn/rules/icons.md +0 -101
  301. package/template/.agents/skills/design/shadcn/rules/styling.md +0 -185
  302. package/template/.agents/skills/find-skills/SKILL.md +0 -141
  303. package/template/.agents/skills/hono/SKILL.md +0 -593
  304. package/template/.agents/skills/integrations/langfuse/SKILL.md +0 -150
  305. package/template/.agents/skills/integrations/langfuse/references/ci-cd.md +0 -41
  306. package/template/.agents/skills/integrations/langfuse/references/cli.md +0 -60
  307. package/template/.agents/skills/integrations/langfuse/references/create-dataset.md +0 -35
  308. package/template/.agents/skills/integrations/langfuse/references/error-analysis.md +0 -87
  309. package/template/.agents/skills/integrations/langfuse/references/instrumentation.md +0 -121
  310. package/template/.agents/skills/integrations/langfuse/references/judge-calibration.md +0 -293
  311. package/template/.agents/skills/integrations/langfuse/references/prompt-engineering.md +0 -35
  312. package/template/.agents/skills/integrations/langfuse/references/prompt-migration.md +0 -79
  313. package/template/.agents/skills/integrations/langfuse/references/sdk-upgrade.md +0 -34
  314. package/template/.agents/skills/integrations/langfuse/references/setting-up-evals.md +0 -65
  315. package/template/.agents/skills/integrations/langfuse/references/skill-feedback.md +0 -35
  316. package/template/.agents/skills/integrations/langfuse/references/trace-evaluator-upgrade.md +0 -76
  317. package/template/.agents/skills/integrations/langfuse/references/user-feedback.md +0 -66
  318. package/template/.agents/skills/integrations/langfuse/references/v4-project-migration.md +0 -75
  319. package/template/.agents/skills/integrations/posthog/SKILL.md +0 -102
  320. package/template/.agents/skills/integrations/posthog/references/error-tracking-alerts.md +0 -63
  321. package/template/.agents/skills/integrations/posthog/references/error-tracking-assigning-issues.md +0 -77
  322. package/template/.agents/skills/integrations/posthog/references/error-tracking-fingerprints.md +0 -57
  323. package/template/.agents/skills/integrations/posthog/references/error-tracking-monitoring.md +0 -140
  324. package/template/.agents/skills/integrations/posthog/references/error-tracking-nextjs.md +0 -490
  325. package/template/.agents/skills/integrations/posthog/references/error-tracking-source-maps.md +0 -45
  326. package/template/.agents/skills/integrations/posthog/references/feature-flags-best-practices.md +0 -139
  327. package/template/.agents/skills/integrations/posthog/references/feature-flags-react.md +0 -302
  328. package/template/.agents/skills/integrations/posthog/references/identify-users.md +0 -202
  329. package/template/.agents/skills/integrations/posthog/references/integration-example.md +0 -706
  330. package/template/.agents/skills/integrations/posthog/references/integration-nextjs.md +0 -385
  331. package/template/.agents/skills/integrations/posthog/references/integration-step-1-begin.md +0 -43
  332. package/template/.agents/skills/integrations/posthog/references/integration-step-2-edit.md +0 -37
  333. package/template/.agents/skills/integrations/posthog/references/integration-step-3-revise.md +0 -22
  334. package/template/.agents/skills/integrations/posthog/references/integration-step-4-conclude.md +0 -38
  335. package/template/.agents/skills/integrations/posthog/references/llm-analytics-anthropic.md +0 -200
  336. package/template/.agents/skills/integrations/posthog/references/llm-analytics-basics.md +0 -62
  337. package/template/.agents/skills/integrations/posthog/references/llm-analytics-costs.md +0 -197
  338. package/template/.agents/skills/integrations/posthog/references/llm-analytics-manual-capture.md +0 -397
  339. package/template/.agents/skills/integrations/posthog/references/llm-analytics-traces.md +0 -98
  340. package/template/.agents/skills/integrations/posthog/references/llm-analytics-vercel-ai.md +0 -120
  341. package/template/.agents/skills/repo/repo-ci/SKILL.md +0 -265
  342. package/template/.agents/skills/repo/repo-init-next-js/SKILL.md +0 -129
  343. package/template/.agents/skills/repo/repo-init-next-js/references/file-contents.md +0 -800
  344. package/template/.agents/skills/repo/repo-init-next-js/scripts/setup.sh +0 -47
  345. package/template/.agents/skills/repo/repo-init-node/SKILL.md +0 -196
  346. package/template/.agents/skills/skill-creator/LICENSE.txt +0 -202
  347. package/template/.agents/skills/skill-creator/SKILL.md +0 -485
  348. package/template/.agents/skills/skill-creator/agents/analyzer.md +0 -274
  349. package/template/.agents/skills/skill-creator/agents/comparator.md +0 -202
  350. package/template/.agents/skills/skill-creator/agents/grader.md +0 -223
  351. package/template/.agents/skills/skill-creator/assets/eval_review.html +0 -146
  352. package/template/.agents/skills/skill-creator/eval-viewer/generate_review.py +0 -471
  353. package/template/.agents/skills/skill-creator/eval-viewer/viewer.html +0 -1325
  354. package/template/.agents/skills/skill-creator/references/schemas.md +0 -430
  355. package/template/.agents/skills/skill-creator/scripts/__init__.py +0 -0
  356. package/template/.agents/skills/skill-creator/scripts/aggregate_benchmark.py +0 -401
  357. package/template/.agents/skills/skill-creator/scripts/generate_report.py +0 -326
  358. package/template/.agents/skills/skill-creator/scripts/improve_description.py +0 -247
  359. package/template/.agents/skills/skill-creator/scripts/package_skill.py +0 -136
  360. package/template/.agents/skills/skill-creator/scripts/quick_validate.py +0 -103
  361. package/template/.agents/skills/skill-creator/scripts/run_eval.py +0 -310
  362. package/template/.agents/skills/skill-creator/scripts/run_loop.py +0 -328
  363. package/template/.agents/skills/skill-creator/scripts/utils.py +0 -47
  364. package/template/.agents/skills/supabase/CHANGELOG.md +0 -78
  365. package/template/.agents/skills/supabase/SKILL.md +0 -149
  366. package/template/.agents/skills/supabase/assets/feedback-issue-template.md +0 -17
  367. package/template/.agents/skills/supabase/references/skill-feedback.md +0 -17
  368. package/template/.agents/skills/supabase-postgres-best-practices/CHANGELOG.md +0 -73
  369. package/template/.agents/skills/supabase-postgres-best-practices/SKILL.md +0 -64
  370. package/template/.agents/skills/supabase-postgres-best-practices/references/_contributing.md +0 -170
  371. package/template/.agents/skills/supabase-postgres-best-practices/references/_sections.md +0 -39
  372. package/template/.agents/skills/supabase-postgres-best-practices/references/_template.md +0 -34
  373. package/template/.agents/skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +0 -55
  374. package/template/.agents/skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +0 -49
  375. package/template/.agents/skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +0 -46
  376. package/template/.agents/skills/supabase-postgres-best-practices/references/conn-limits.md +0 -44
  377. package/template/.agents/skills/supabase-postgres-best-practices/references/conn-pooling.md +0 -41
  378. package/template/.agents/skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +0 -46
  379. package/template/.agents/skills/supabase-postgres-best-practices/references/data-batch-inserts.md +0 -54
  380. package/template/.agents/skills/supabase-postgres-best-practices/references/data-n-plus-one.md +0 -53
  381. package/template/.agents/skills/supabase-postgres-best-practices/references/data-pagination.md +0 -50
  382. package/template/.agents/skills/supabase-postgres-best-practices/references/data-upsert.md +0 -50
  383. package/template/.agents/skills/supabase-postgres-best-practices/references/lock-advisory.md +0 -56
  384. package/template/.agents/skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +0 -68
  385. package/template/.agents/skills/supabase-postgres-best-practices/references/lock-short-transactions.md +0 -50
  386. package/template/.agents/skills/supabase-postgres-best-practices/references/lock-skip-locked.md +0 -54
  387. package/template/.agents/skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +0 -45
  388. package/template/.agents/skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +0 -55
  389. package/template/.agents/skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +0 -55
  390. package/template/.agents/skills/supabase-postgres-best-practices/references/query-composite-indexes.md +0 -44
  391. package/template/.agents/skills/supabase-postgres-best-practices/references/query-covering-indexes.md +0 -40
  392. package/template/.agents/skills/supabase-postgres-best-practices/references/query-index-types.md +0 -48
  393. package/template/.agents/skills/supabase-postgres-best-practices/references/query-missing-indexes.md +0 -43
  394. package/template/.agents/skills/supabase-postgres-best-practices/references/query-partial-indexes.md +0 -45
  395. package/template/.agents/skills/supabase-postgres-best-practices/references/schema-constraints.md +0 -80
  396. package/template/.agents/skills/supabase-postgres-best-practices/references/schema-data-types.md +0 -46
  397. package/template/.agents/skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +0 -59
  398. package/template/.agents/skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +0 -55
  399. package/template/.agents/skills/supabase-postgres-best-practices/references/schema-partitioning.md +0 -55
  400. package/template/.agents/skills/supabase-postgres-best-practices/references/schema-primary-keys.md +0 -61
  401. package/template/.agents/skills/supabase-postgres-best-practices/references/security-privileges.md +0 -54
  402. package/template/.agents/skills/supabase-postgres-best-practices/references/security-rls-basics.md +0 -50
  403. package/template/.agents/skills/supabase-postgres-best-practices/references/security-rls-performance.md +0 -63
  404. package/template/.agents/skills/writing/humanizer/LICENSE +0 -21
  405. package/template/.agents/skills/writing/humanizer/README.md +0 -209
  406. package/template/.agents/skills/writing/humanizer/SKILL.md +0 -456
  407. package/template/.agents/upstreams.json +0 -115
@@ -1,432 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import { fileURLToPath } from 'node:url';
4
-
5
- import { loadDesignSystemForTarget } from '../design-system.mjs';
6
- import { RULE_SCOPES, filterByScopes } from '../registry/antipatterns.mjs';
7
- import { createBrowserDetector, detectUrl } from '../engines/browser/detect-url.mjs';
8
- import { detectHtml } from '../engines/static-html/detect-html.mjs';
9
- import { detectText } from '../engines/regex/detect-text.mjs';
10
- import {
11
- filterDetectionFindings,
12
- readDetectionConfig,
13
- shouldIgnoreDetectionFile,
14
- } from '../../lib/impeccable-config.mjs';
15
- import {
16
- HTML_EXTENSIONS,
17
- buildImportGraph,
18
- detectFrameworkConfig,
19
- isPortListening,
20
- walkDir,
21
- } from '../node/file-system.mjs';
22
-
23
- // ---------------------------------------------------------------------------
24
- // Output formatting
25
- // ---------------------------------------------------------------------------
26
-
27
- function formatFindingSummary(count) {
28
- return `${count} anti-pattern${count === 1 ? '' : 's'} found.`;
29
- }
30
-
31
- // Local filesystem path behind a file:// URL, or null when it can't be mapped.
32
- function fileUrlToLocalPath(url) {
33
- try {
34
- return fileURLToPath(url);
35
- } catch {
36
- return null;
37
- }
38
- }
39
-
40
- // Advisory findings are detected but never treated as failures: they list in a
41
- // separate, visually dimmed section, are excluded from the failure count that
42
- // drives the exit code, and carry `"advisory": true` in JSON so consumers can
43
- // filter. Every advisory finding carries the flag (stamped by the registry via
44
- // findings.mjs).
45
- function isAdvisory(finding) {
46
- return finding && finding.advisory === true;
47
- }
48
-
49
- function partitionAdvisory(findings) {
50
- const primary = [];
51
- const advisory = [];
52
- for (const f of findings) (isAdvisory(f) ? advisory : primary).push(f);
53
- return { primary, advisory };
54
- }
55
-
56
- // ANSI dim, when stderr is a TTY. Advisory output is chrome, so keep it quiet.
57
- function dim(text) {
58
- return process.stderr.isTTY ? `\x1b[2m${text}\x1b[0m` : text;
59
- }
60
-
61
- function formatFindingsBody(findings) {
62
- const grouped = {};
63
- for (const f of findings) {
64
- if (!grouped[f.file]) grouped[f.file] = [];
65
- grouped[f.file].push(f);
66
- }
67
- const out = [];
68
- for (const [file, items] of Object.entries(grouped)) {
69
- const importNote = items[0]?.importedBy?.length ? ` (imported by ${items[0].importedBy.join(', ')})` : '';
70
- out.push(`\n${file}${importNote}`);
71
- for (const item of items) {
72
- out.push(` ${item.line ? `line ${item.line}: ` : ''}[${item.antipattern}] ${item.snippet}`);
73
- out.push(` → ${item.description}`);
74
- }
75
- }
76
- return out;
77
- }
78
-
79
- function formatAdvisorySection(advisory) {
80
- if (!advisory || advisory.length === 0) return '';
81
- const lines = [`\n${dim('── Advisory (not counted as failures) ──')}`];
82
- for (const line of formatFindingsBody(advisory)) lines.push(dim(line));
83
- lines.push(dim(`\n${advisory.length} advisory note${advisory.length === 1 ? '' : 's'}. Suppress with --no-advisory.`));
84
- return lines.join('\n');
85
- }
86
-
87
- // Text/JSON formatter. `findings` is the full set; advisory items are separated
88
- // out into their own section and excluded from the failure summary count. JSON
89
- // output keeps every finding (each advisory one flagged) in a single array.
90
- function formatFindings(findings, jsonMode) {
91
- if (jsonMode) return JSON.stringify(findings, null, 2);
92
-
93
- const { primary, advisory } = partitionAdvisory(findings);
94
- const out = [...formatFindingsBody(primary)];
95
- out.push(`\n${formatFindingSummary(primary.length)}`);
96
- const advisorySection = formatAdvisorySection(advisory);
97
- if (advisorySection) out.push(advisorySection);
98
- return out.join('\n');
99
- }
100
-
101
- // ---------------------------------------------------------------------------
102
- // Stdin handling
103
- // ---------------------------------------------------------------------------
104
-
105
- // `optionsFor` maps a local path to scan options carrying that path's own
106
- // project design system (or base options when null). Falls back to a plain
107
- // object so direct/legacy callers still work.
108
- async function detectLocalFile(filePath, options) {
109
- if (HTML_EXTENSIONS.has(path.extname(filePath).toLowerCase())) {
110
- return detectHtml(filePath, options);
111
- }
112
- return detectText(fs.readFileSync(filePath, 'utf-8'), filePath, options);
113
- }
114
-
115
- async function handleStdin(optionsFor = () => ({})) {
116
- const resolve = typeof optionsFor === 'function' ? optionsFor : () => optionsFor;
117
- const chunks = [];
118
- for await (const chunk of process.stdin) chunks.push(chunk);
119
- const input = Buffer.concat(chunks).toString('utf-8');
120
- try {
121
- const parsed = JSON.parse(input);
122
- const fp = parsed?.tool_input?.file_path;
123
- if (fp && fs.existsSync(fp)) {
124
- return detectLocalFile(fp, resolve(fp));
125
- }
126
- } catch { /* not JSON */ }
127
- return detectText(input, '<stdin>', resolve(null));
128
- }
129
-
130
-
131
- // ---------------------------------------------------------------------------
132
- // CLI
133
- // ---------------------------------------------------------------------------
134
-
135
- async function confirm(question) {
136
- const rl = (await import('node:readline')).default.createInterface({
137
- input: process.stdin, output: process.stderr,
138
- });
139
- return new Promise((resolve) => {
140
- rl.question(`${question} [Y/n] `, (answer) => {
141
- rl.close();
142
- resolve(!answer || /^y(es)?$/i.test(answer.trim()));
143
- });
144
- });
145
- }
146
-
147
- function printUsage() {
148
- console.log(`Usage: impeccable detect [options] [file-or-dir-or-url...]
149
-
150
- Scan files or URLs for UI anti-patterns and design quality issues.
151
-
152
- Options:
153
- --json Output results as JSON
154
- --quiet In text mode, only print the final findings count
155
- --scope <name> Only report rules in the given design domain
156
- (type, layout). Comma-separated.
157
- --viewport <WxH> Browser viewport for URL scans (default 1280x800),
158
- e.g. --viewport 390x844 for a mobile-width pass
159
- --no-config Do not apply project config, detector ignores, inline
160
- ignore comments, or DESIGN.md
161
- --no-inline-ignores Do not honor in-file impeccable-disable* ignore comments
162
- --no-design-system Do not load local DESIGN.md / .impeccable/design.json context
163
- --no-advisory Suppress advisory findings entirely (e.g. em-dash overuse)
164
- --help Show this help message
165
-
166
- Advisory findings:
167
- Some rules are advisory: detected and listed in a separate section, but never
168
- counted as failures and never changing the exit code. They stay out of the
169
- failure count so they never block automation. --no-advisory hides them.
170
-
171
- Project config:
172
- Respects .impeccable/config.json and .impeccable/config.local.json detector
173
- settings: detector.ignoreRules, detector.ignoreFiles, detector.ignoreValues,
174
- and detector.designSystem.enabled.
175
-
176
- Inline ignores:
177
- In-file comments waive a finding where it lives and travel with the file:
178
- <!-- impeccable-disable overused-font -- exported brand doc -->
179
- .brand { font-family: Inter } /* impeccable-disable-line overused-font */
180
- // impeccable-disable-next-line bounce-easing: intentional bounce
181
- impeccable-disable applies to the whole file; -line / -next-line are scoped.
182
- List one or more rule ids (comma-separated), or omit them / use * for all.
183
-
184
- Detection modes:
185
- HTML files Static HTML/CSS analysis (default, catches linked CSS)
186
- Non-HTML files Regex pattern matching (CSS, JSX, TSX, etc.)
187
- URLs Puppeteer full browser rendering (auto-detected;
188
- http(s):// and file:// URLs)
189
-
190
- Examples:
191
- impeccable detect src/
192
- impeccable detect index.html
193
- impeccable detect https://example.com
194
- impeccable detect --json .
195
- impeccable detect --no-config src/`);
196
- }
197
-
198
- async function detectCli() {
199
- let args = process.argv.slice(2).map(arg => {
200
- if (arg === '-json') return '--json';
201
- if (arg === '-fast') return '--fast';
202
- return arg;
203
- });
204
- if (args[0] === 'detect') args = args.slice(1);
205
- const jsonMode = args.includes('--json');
206
- const quietMode = args.includes('--quiet');
207
- const helpMode = args.includes('--help');
208
- const noAdvisory = args.includes('--no-advisory');
209
- // --fast (regex-only) is deprecated: since the jsdom removal, the static
210
- // HTML/CSS analysis is fast and covers every rule, so the regex-only path
211
- // only loses coverage for no real speed win. Accept the flag for back-compat
212
- // but ignore it and run the full scan.
213
- if (args.includes('--fast')) {
214
- process.stderr.write(
215
- 'Note: --fast is deprecated and ignored. The full scan is fast now and runs every rule.\n',
216
- );
217
- }
218
- if (args.includes('--gpt') || args.includes('--gemini')) {
219
- process.stderr.write(
220
- 'Note: --gpt and --gemini are deprecated and ignored. Generated-UI tells now run by default.\n',
221
- );
222
- }
223
- const configEnabled = !args.includes('--no-config');
224
- const detectionConfig = configEnabled
225
- ? readDetectionConfig(process.cwd())
226
- : { ignoreRules: [], ignoreFiles: [], ignoreValues: [] };
227
- const scopes = [];
228
- for (let i = 0; i < args.length; i++) {
229
- if (args[i] !== '--scope' && !args[i].startsWith('--scope=')) continue;
230
- const inline = args[i].startsWith('--scope=');
231
- const value = inline ? args[i].slice('--scope='.length) : args[i + 1];
232
- const parsed = (value && !value.startsWith('--'))
233
- ? value.split(',').map(s => s.trim()).filter(Boolean)
234
- : [];
235
- // A bare `--scope` would otherwise fall out of `targets` and scan unscoped;
236
- // fail loudly so a mistyped pre-scan never runs the wrong rule set.
237
- if (parsed.length === 0) {
238
- process.stderr.write(
239
- `Error: --scope requires a value. Valid scopes: ${[...RULE_SCOPES].join(', ')}\n`,
240
- );
241
- process.exit(1);
242
- }
243
- scopes.push(...parsed);
244
- args.splice(i, inline ? 1 : 2);
245
- i -= 1;
246
- }
247
- let viewport = null;
248
- for (let i = 0; i < args.length; i++) {
249
- if (args[i] !== '--viewport' && !args[i].startsWith('--viewport=')) continue;
250
- const inline = args[i].startsWith('--viewport=');
251
- const value = inline ? args[i].slice('--viewport='.length) : args[i + 1];
252
- const match = /^(\d{2,5})x(\d{2,5})$/i.exec(value || '');
253
- if (!match) {
254
- process.stderr.write('Error: --viewport requires a WxH value, e.g. --viewport 390x844\n');
255
- process.exit(1);
256
- }
257
- viewport = { width: Number(match[1]), height: Number(match[2]) };
258
- args.splice(i, inline ? 1 : 2);
259
- i -= 1;
260
- }
261
- const unknownScopes = scopes.filter(s => !RULE_SCOPES.has(s));
262
- if (unknownScopes.length > 0) {
263
- process.stderr.write(
264
- `Error: unknown --scope value(s): ${unknownScopes.join(', ')}. Valid scopes: ${[...RULE_SCOPES].join(', ')}\n`,
265
- );
266
- process.exit(1);
267
- }
268
- const designSystemEnabled = configEnabled && !args.includes('--no-design-system') && detectionConfig.designSystem?.enabled !== false;
269
- // Inline `impeccable-disable*` waivers are part of the scanned file, so they
270
- // apply by default. `--no-config` (raw scan) and the dedicated
271
- // `--no-inline-ignores` both turn them off.
272
- const inlineIgnoresEnabled = configEnabled && !args.includes('--no-inline-ignores');
273
- const baseScanOptions = { inlineIgnores: inlineIgnoresEnabled };
274
- if (viewport) baseScanOptions.viewport = viewport;
275
- // DESIGN.md must resolve from EACH scan target's own project root, not from
276
- // process.cwd(): scanning project B's files from inside project A applied A's
277
- // design rules (cross-project contamination). Resolve per target, memoized by
278
- // resolved project root so a multi-file scan pays the read once per project.
279
- // A target with no project marker above it gets no design system (never cwd's).
280
- const designSystemCache = new Map();
281
- const scanOptionsFor = (localPath) => {
282
- if (!designSystemEnabled || !localPath) return baseScanOptions;
283
- const designSystem = loadDesignSystemForTarget(localPath, { cache: designSystemCache });
284
- return designSystem ? { ...baseScanOptions, designSystem } : baseScanOptions;
285
- };
286
- const targets = args.filter(a => !a.startsWith('--'));
287
-
288
- if (helpMode) { printUsage(); process.exit(0); }
289
-
290
- let allFindings = [];
291
-
292
- if (!process.stdin.isTTY && targets.length === 0) {
293
- allFindings = await handleStdin(scanOptionsFor);
294
- } else {
295
- const paths = targets.length > 0 ? targets : [process.cwd()];
296
- // file:// URLs get the same Puppeteer-rendered pass as http(s) — the
297
- // real cascade, real computed styles, real layout. Callers that want a
298
- // browser-grade scan of a local artifact can pass file:///abs/path.html
299
- // instead of the bare path (which stays on the static engine).
300
- const urlRe = /^(?:https?|file):\/\//i;
301
- const urlTargetCount = paths.filter(target => urlRe.test(target)).length;
302
- const browserDetector = urlTargetCount > 1 ? await createBrowserDetector() : null;
303
-
304
- try {
305
- for (const target of paths) {
306
- if (urlRe.test(target)) {
307
- // A file:// URL points at a local artifact, so its design system
308
- // resolves from that file's project. A remote http(s) URL has no
309
- // local project — it gets base options (no design system), never
310
- // process.cwd()'s.
311
- const urlOptions = /^file:/i.test(target)
312
- ? scanOptionsFor(fileUrlToLocalPath(target))
313
- : baseScanOptions;
314
- try {
315
- const scanner = browserDetector
316
- ? (url) => browserDetector.detectUrl(url, urlOptions)
317
- : (url) => detectUrl(url, urlOptions);
318
- allFindings.push(...await scanner(target));
319
- } catch (e) { process.stderr.write(`Error: ${e.message}\n`); }
320
- continue;
321
- }
322
-
323
- const resolved = path.resolve(target);
324
- let stat;
325
- try { stat = fs.statSync(resolved); }
326
- catch { process.stderr.write(`Warning: cannot access ${target}\n`); continue; }
327
-
328
- if (stat.isDirectory()) {
329
- // Check for framework dev server config (skip in JSON/quiet modes to avoid polluting output)
330
- if (!jsonMode && !quietMode) {
331
- const fwConfig = detectFrameworkConfig(resolved);
332
- if (fwConfig) {
333
- const probe = await isPortListening(fwConfig.port, fwConfig.fingerprint);
334
- if (probe.listening && probe.matched) {
335
- process.stderr.write(
336
- `\n${fwConfig.name} dev server detected on localhost:${fwConfig.port}.\n` +
337
- `For more accurate results, scan the running site:\n` +
338
- ` npx impeccable detect http://localhost:${fwConfig.port}\n\n`
339
- );
340
- } else if (probe.listening && !probe.matched) {
341
- process.stderr.write(
342
- `\n${fwConfig.name} project detected (${path.basename(fwConfig.configPath)}).\n` +
343
- `Port ${fwConfig.port} is in use by another service. Start the ${fwConfig.name} dev server and scan via URL for best results.\n\n`
344
- );
345
- } else {
346
- process.stderr.write(
347
- `\n${fwConfig.name} project detected (${path.basename(fwConfig.configPath)}).\n` +
348
- `Start the dev server and scan via URL for best results:\n` +
349
- ` npx impeccable detect http://localhost:${fwConfig.port}\n\n`
350
- );
351
- }
352
- }
353
- }
354
-
355
- const files = walkDir(resolved)
356
- .filter(file => !shouldIgnoreDetectionFile(file, process.cwd(), detectionConfig));
357
- const htmlCount = files.filter(f => HTML_EXTENSIONS.has(path.extname(f).toLowerCase())).length;
358
-
359
- // Warn and confirm if scanning many files (static HTML/CSS processes each HTML file)
360
- if (files.length > 50 && process.stdin.isTTY && !jsonMode && !quietMode) {
361
- process.stderr.write(
362
- `\nFound ${files.length} files (${htmlCount} HTML) in ${target}.\n` +
363
- `Scanning may take a while${htmlCount > 10 ? ' (static HTML/CSS processes each HTML file individually)' : ''}.\n` +
364
- `Target a specific subdirectory to narrow scope.\n`
365
- );
366
- const ok = await confirm('Continue?');
367
- if (!ok) { process.stderr.write('Aborted.\n'); process.exit(0); }
368
- }
369
-
370
- // Build import graph for multi-file awareness
371
- const graph = buildImportGraph(files);
372
- // Build reverse map: file -> set of files that import it
373
- const importedByMap = new Map();
374
- for (const [importer, imports] of graph) {
375
- for (const imported of imports) {
376
- if (!importedByMap.has(imported)) importedByMap.set(imported, new Set());
377
- importedByMap.get(imported).add(importer);
378
- }
379
- }
380
-
381
- for (const file of files) {
382
- // Each file resolves its own project design system (cached by root),
383
- // so a scan spanning sibling projects applies the right rules per file.
384
- const fileOptions = scanOptionsFor(file);
385
- const fileFindings = await detectLocalFile(file, fileOptions);
386
- // Annotate findings with import context
387
- const importers = importedByMap.get(file);
388
- if (importers && importers.size > 0) {
389
- const importerNames = [...importers].map(f => path.basename(f));
390
- for (const f of fileFindings) {
391
- f.importedBy = importerNames;
392
- }
393
- }
394
- allFindings.push(...fileFindings);
395
- }
396
- } else if (stat.isFile()) {
397
- if (shouldIgnoreDetectionFile(resolved, process.cwd(), detectionConfig)) continue;
398
- const fileOptions = scanOptionsFor(resolved);
399
- allFindings.push(...await detectLocalFile(resolved, fileOptions));
400
- }
401
- }
402
- } finally {
403
- if (browserDetector) await browserDetector.close();
404
- }
405
- }
406
-
407
- allFindings = filterDetectionFindings(allFindings, detectionConfig);
408
- allFindings = filterByScopes(allFindings, scopes);
409
- // --no-advisory drops advisory findings before any output or exit-code math.
410
- if (noAdvisory) allFindings = allFindings.filter((f) => !isAdvisory(f));
411
-
412
- // The exit code and failure count reflect non-advisory findings only. An
413
- // advisory-only scan still prints its notes but exits 0 (a clean pass), so
414
- // advisory rules never break CI or block automation.
415
- const { primary, advisory } = partitionAdvisory(allFindings);
416
-
417
- if (allFindings.length > 0) {
418
- if (jsonMode) process.stdout.write(formatFindings(allFindings, true) + '\n');
419
- else if (quietMode) {
420
- process.stderr.write(formatFindingSummary(primary.length) + '\n');
421
- if (advisory.length > 0) {
422
- process.stderr.write(dim(`${advisory.length} advisory note${advisory.length === 1 ? '' : 's'} (not counted).`) + '\n');
423
- }
424
- }
425
- else process.stderr.write(formatFindings(allFindings, false) + '\n');
426
- process.exit(primary.length > 0 ? 2 : 0);
427
- }
428
- if (jsonMode) process.stdout.write('[]\n');
429
- process.exit(0);
430
- }
431
-
432
- export { formatFindings, handleStdin, confirm, printUsage, detectCli };