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,127 +0,0 @@
1
- // ─── Section 1: Constants ───────────────────────────────────────────────────
2
-
3
- const SAFE_TAGS = new Set([
4
- 'blockquote', 'nav', 'a', 'input', 'textarea', 'select',
5
- 'pre', 'code', 'span', 'th', 'td', 'tr', 'li', 'label',
6
- 'button', 'hr', 'html', 'head', 'body', 'script', 'style',
7
- 'link', 'meta', 'title', 'br', 'img', 'svg', 'path', 'circle',
8
- 'rect', 'line', 'polyline', 'polygon', 'g', 'defs', 'use',
9
- ]);
10
-
11
- // Per-check safe-tags override for the border (side-tab / border-accent)
12
- // rule. We intentionally re-allow <label> here because card-shaped clickable
13
- // labels (e.g. .checklist-item wrapping a checkbox + content) are one of the
14
- // canonical side-tab anti-pattern shapes and must be detected. The rule's
15
- // other preconditions (non-neutral color, width >= 2px on a single side,
16
- // radius > 0 or width >= 3, element size >= 20x20 in the browser path)
17
- // already filter out plain inline form labels so this does not introduce
18
- // false positives. See modern-color-borders.html for the test matrix.
19
- const BORDER_SAFE_TAGS = new Set(
20
- [...SAFE_TAGS].filter(t => t !== 'label')
21
- );
22
-
23
- const OVERUSED_FONTS = new Set([
24
- // Older monoculture (still ubiquitous):
25
- 'inter', 'roboto', 'open sans', 'lato', 'montserrat', 'arial', 'helvetica',
26
- // Newer monoculture (the Anthropic-skill / Vercel / GitHub default wave):
27
- 'fraunces', 'instrument sans', 'instrument serif',
28
- 'geist', 'geist sans', 'geist mono',
29
- 'mona sans',
30
- 'plus jakarta sans', 'space grotesk', 'recoleta',
31
- ]);
32
-
33
- // Brand-associated fonts: don't flag these as "overused" on the brand's own domains.
34
- // Keys are font names, values are arrays of hostname suffixes where the font is allowed.
35
- const GOOGLE_DOMAINS = [
36
- 'google.com', 'youtube.com', 'android.com', 'chromium.org',
37
- 'chrome.com', 'web.dev', 'gstatic.com', 'firebase.google.com',
38
- ];
39
- const VERCEL_DOMAINS = ['vercel.com', 'nextjs.org', 'v0.app'];
40
- const GITHUB_DOMAINS = ['github.com', 'githubnext.com'];
41
- const BRAND_FONT_DOMAINS = {
42
- 'roboto': GOOGLE_DOMAINS,
43
- 'google sans': GOOGLE_DOMAINS,
44
- 'product sans': GOOGLE_DOMAINS,
45
- 'geist': VERCEL_DOMAINS,
46
- 'geist sans': VERCEL_DOMAINS,
47
- 'geist mono': VERCEL_DOMAINS,
48
- 'mona sans': GITHUB_DOMAINS,
49
- };
50
-
51
- function isBrandFontOnOwnDomain(font) {
52
- if (typeof location === 'undefined') return false;
53
- const allowed = BRAND_FONT_DOMAINS[font];
54
- if (!allowed) return false;
55
- const host = location.hostname.toLowerCase();
56
- return allowed.some(suffix => host === suffix || host.endsWith('.' + suffix));
57
- }
58
-
59
- // Overused-font primary selection skips only CSS generics so a system stack
60
- // keeps the system face as primary; GENERIC_FONTS still includes platform
61
- // faces for design-system/serif resolution.
62
- const CSS_GENERIC_FONTS = new Set([
63
- 'serif', 'sans-serif', 'monospace', 'cursive', 'fantasy',
64
- 'inherit', 'initial', 'unset', 'revert',
65
- ]);
66
-
67
- const GENERIC_FONTS = new Set([
68
- ...CSS_GENERIC_FONTS,
69
- 'system-ui', 'ui-serif', 'ui-sans-serif', 'ui-monospace', 'ui-rounded',
70
- '-apple-system', 'blinkmacsystemfont', 'segoe ui',
71
- ]);
72
-
73
- function primaryFontFace(fontFamily, skip = CSS_GENERIC_FONTS) {
74
- return String(fontFamily || '')
75
- .split(',')
76
- .map(f => f.trim().replace(/^['"]|['"]$/g, '').toLowerCase())
77
- .find(f => f && !skip.has(f)) || null;
78
- }
79
-
80
- // WCAG large text thresholds are defined in points: 18pt normal text and
81
- // 14pt bold text. Browsers expose font-size in CSS pixels at 96px per inch.
82
- const WCAG_LARGE_TEXT_PX = 18 * (96 / 72);
83
- const WCAG_LARGE_BOLD_TEXT_PX = 14 * (96 / 72);
84
-
85
- // Em-dash overuse (advisory) thresholds, shared by the regex/static-HTML
86
- // analyzer and the browser DOM check so both fire on the same saturation
87
- // pattern. Two gates must hold: an absolute floor of EM_DASH_FLOOR dashes, and
88
- // a density of at least one dash per EM_DASH_CHARS_PER_DASH characters of body
89
- // text. A long article that uses a few em-dashes is left alone; a short,
90
- // dash-per-clause page is not.
91
- const EM_DASH_FLOOR = 8;
92
- const EM_DASH_CHARS_PER_DASH = 500;
93
-
94
- // Serif faces that show up in italic-display heroes. The rule also fires when
95
- // the primary face is unknown but the stack ends in the generic `serif` token,
96
- // which catches custom/private faces with a serif fallback.
97
- const KNOWN_SERIF_FONTS = new Set([
98
- 'fraunces', 'recoleta', 'newsreader', 'playfair display', 'playfair',
99
- 'cormorant', 'cormorant garamond', 'garamond', 'eb garamond',
100
- 'tiempos', 'tiempos headline', 'tiempos text',
101
- 'lora', 'vollkorn', 'spectral',
102
- 'source serif pro', 'source serif 4', 'source serif',
103
- 'ibm plex serif', 'merriweather',
104
- 'libre caslon', 'libre baskerville', 'baskerville',
105
- 'georgia', 'times new roman', 'times',
106
- 'dm serif display', 'dm serif text',
107
- 'instrument serif', 'gt sectra', 'ogg', 'canela',
108
- 'freight display', 'freight text',
109
- ]);
110
-
111
- export {
112
- SAFE_TAGS,
113
- BORDER_SAFE_TAGS,
114
- OVERUSED_FONTS,
115
- GOOGLE_DOMAINS,
116
- VERCEL_DOMAINS,
117
- GITHUB_DOMAINS,
118
- BRAND_FONT_DOMAINS,
119
- isBrandFontOnOwnDomain,
120
- GENERIC_FONTS,
121
- primaryFontFace,
122
- WCAG_LARGE_TEXT_PX,
123
- WCAG_LARGE_BOLD_TEXT_PX,
124
- EM_DASH_FLOOR,
125
- EM_DASH_CHARS_PER_DASH,
126
- KNOWN_SERIF_FONTS,
127
- };
@@ -1,30 +0,0 @@
1
- const GOOGLE_FONTS_URL_RE = /fonts\.googleapis\.com\/css2?\?[^"'\s)<>]*/gi;
2
-
3
- function normalizeGoogleFontFamilyParam(value) {
4
- return String(value || '')
5
- .split('|')
6
- .map(part => part.split(':')[0].trim().toLowerCase())
7
- .filter(Boolean);
8
- }
9
-
10
- function extractGoogleFontFamilies(text) {
11
- const families = [];
12
- if (!text) return families;
13
-
14
- GOOGLE_FONTS_URL_RE.lastIndex = 0;
15
- let urlMatch;
16
- while ((urlMatch = GOOGLE_FONTS_URL_RE.exec(text)) !== null) {
17
- const url = urlMatch[0];
18
- const queryStart = url.indexOf('?');
19
- if (queryStart === -1) continue;
20
-
21
- const params = new URLSearchParams(url.slice(queryStart + 1).replace(/&amp;/g, '&'));
22
- for (const value of params.getAll('family')) {
23
- families.push(...normalizeGoogleFontFamilyParam(value));
24
- }
25
- }
26
-
27
- return families;
28
- }
29
-
30
- export { extractGoogleFontFamilies };
@@ -1,148 +0,0 @@
1
- /**
2
- * Inline, in-file ignore directives — eslint-disable-style waivers that live at
3
- * the point they apply and travel with the artifact instead of (or alongside)
4
- * an ignore in `.impeccable/config.json`.
5
- *
6
- * A config ignore is the right default for repo-wide policy. This complements it
7
- * for the one case config can't cover: a waiver that belongs to a single file and
8
- * needs to follow that file when it leaves the repo — a generated/exported
9
- * standalone document, an emailed HTML file, a snippet scanned out of context.
10
- *
11
- * Comment-syntax-agnostic: the directive is a raw token matched anywhere on a
12
- * line, so the same marker works across every comment style impeccable scans —
13
- * `//`, `/* *\/`, `<!-- -->`, `#`, `{/* *\/}`, `{# #}`. Trailing comment closers
14
- * are stripped before the rule list is parsed.
15
- *
16
- * Syntax (reason optional; eslint `--` or biome `:` separator):
17
- *
18
- * impeccable-disable <rule>[, <rule>...] [-- reason] whole file
19
- * impeccable-disable-line <rule>... [-- reason] the same line
20
- * impeccable-disable-next-line <rule>... [-- reason] the following line
21
- * impeccable-disable bare / `*` = every rule
22
- *
23
- * Examples:
24
- *
25
- * <!-- impeccable-disable overused-font -- exported brand doc, font is first-party -->
26
- * .brand { font-family: Inter; } /* impeccable-disable-line overused-font *\/
27
- * // impeccable-disable-next-line bounce-easing: intentional playful affordance
28
- *
29
- * Behavior is suppression, for parity with config ignores: a matched directive
30
- * drops the finding. The inline reason is self-documenting in the diff; it is not
31
- * required and is discarded at scan time (only used here to keep reason words out
32
- * of the parsed rule list).
33
- */
34
-
35
- const DIRECTIVE_RE = /impeccable-(disable-next-line|disable-line|disable)\b[ \t]*([^\n\r]*)/gi;
36
-
37
- // Trailing comment closers, so `*/`, `*/}`, `-->`, `*}`, `#}`, `%>`, `}}` don't
38
- // leak into the rule list. Anchored to end-of-line; the leading `\s*` mops up the
39
- // space before the closer. `--+>` covers `-->` and any longer dash run.
40
- const TRAILING_CLOSER_RE = /\s*(?:\*\/\}?|--+>|\*\}|#\}|%>|\}\})\s*$/;
41
-
42
- function normalizeRule(token) {
43
- return String(token || '').trim().toLowerCase();
44
- }
45
-
46
- // Split the directive remainder into rule tokens, dropping any human reason that
47
- // follows an eslint-style `--` or biome-style `:` separator. Rule ids only ever
48
- // contain single hyphens (`overused-font`, `bounce-easing`), so `--` and `:`
49
- // are unambiguous separators.
50
- function parseRuleList(remainder) {
51
- let text = String(remainder || '').replace(TRAILING_CLOSER_RE, '').trim();
52
- // Cut off a human reason at the first `--` (eslint) or `:` (biome) separator.
53
- const reasonSep = text.match(/\s*(?:--+|:)\s*/);
54
- if (reasonSep) text = text.slice(0, reasonSep.index);
55
- const tokens = text.split(/[\s,]+/).map(normalizeRule).filter(Boolean);
56
- if (tokens.length === 0 || tokens.includes('*')) return ['*'];
57
- return tokens;
58
- }
59
-
60
- function addRules(set, rules) {
61
- for (const rule of rules) set.add(rule);
62
- }
63
-
64
- function getSet(map, key) {
65
- let set = map.get(key);
66
- if (!set) {
67
- set = new Set();
68
- map.set(key, set);
69
- }
70
- return set;
71
- }
72
-
73
- /**
74
- * Parse every inline ignore directive in a file's raw text.
75
- *
76
- * Returns sets keyed by the 1-based line the directive *targets* so matching is a
77
- * direct lookup:
78
- * - file: rules disabled for the whole file
79
- * - line: line -> rules disabled on that exact line (disable-line)
80
- * - nextLine: line -> rules disabled on that line (disable-next-line on line-1)
81
- *
82
- * `*` in any set means "every rule".
83
- */
84
- function parseInlineIgnores(content) {
85
- const result = { file: new Set(), line: new Map(), nextLine: new Map() };
86
- const text = typeof content === 'string' ? content : '';
87
- // Cheap bail-out: the substring must be present for any directive to exist.
88
- // Case-insensitive to match DIRECTIVE_RE's `i` flag (e.g. `Impeccable-Disable`).
89
- if (!/impeccable-disable/i.test(text)) return result;
90
-
91
- // Split on `\n` only, exactly as detectText numbers lines, so directive line
92
- // keys line up with finding `line` values (incl. on `\r`-only line endings).
93
- // The directive regex excludes `\r`, so a trailing `\r` on `\r\n` files is
94
- // never captured into the rule list.
95
- const lines = text.split('\n');
96
- for (let i = 0; i < lines.length; i++) {
97
- DIRECTIVE_RE.lastIndex = 0;
98
- let m;
99
- while ((m = DIRECTIVE_RE.exec(lines[i])) !== null) {
100
- const variant = m[1].toLowerCase();
101
- const rules = parseRuleList(m[2]);
102
- if (variant === 'disable') {
103
- addRules(result.file, rules);
104
- } else if (variant === 'disable-line') {
105
- addRules(getSet(result.line, i + 1), rules);
106
- } else {
107
- // disable-next-line on line i+1 targets line i+2.
108
- addRules(getSet(result.nextLine, i + 2), rules);
109
- }
110
- }
111
- }
112
- return result;
113
- }
114
-
115
- function setMatches(set, rule) {
116
- return Boolean(set) && (set.has('*') || set.has(rule));
117
- }
118
-
119
- function isInlineIgnored(finding, directives) {
120
- const rule = normalizeRule(finding && finding.antipattern);
121
- if (!rule) return false;
122
- if (setMatches(directives.file, rule)) return true;
123
- const line = Number(finding && finding.line) || 0;
124
- if (line > 0) {
125
- if (setMatches(directives.line.get(line), rule)) return true;
126
- if (setMatches(directives.nextLine.get(line), rule)) return true;
127
- }
128
- return false;
129
- }
130
-
131
- function hasDirectives(directives) {
132
- return directives.file.size > 0 || directives.line.size > 0 || directives.nextLine.size > 0;
133
- }
134
-
135
- /**
136
- * Drop findings waived by an inline directive in the same file's source text.
137
- * Findings without a usable line number (e.g. static-HTML page-level findings)
138
- * are only matched by whole-file directives — which is the standalone-document
139
- * case this primitive exists for.
140
- */
141
- function applyInlineIgnores(findings, content) {
142
- if (!Array.isArray(findings) || findings.length === 0) return findings;
143
- const directives = parseInlineIgnores(content);
144
- if (!hasDirectives(directives)) return findings;
145
- return findings.filter((finding) => !isInlineIgnored(finding, directives));
146
- }
147
-
148
- export { parseInlineIgnores, applyInlineIgnores, isInlineIgnored };
@@ -1,7 +0,0 @@
1
- /** Check if content looks like a full page (not a component/partial) */
2
- function isFullPage(content) {
3
- const stripped = content.replace(/<!--[\s\S]*?-->/g, '');
4
- return /<!doctype\s|<html[\s>]|<head[\s>]/i.test(stripped);
5
- }
6
-
7
- export { isFullPage };
@@ -1,329 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Deep staleness pass over Impeccable's own project artifacts.
4
- *
5
- * node doctor.mjs # human-readable report
6
- * node doctor.mjs --json # machine-readable, for the skill command
7
- * node doctor.mjs --fix # apply the mechanical migrations only
8
- * node doctor.mjs --target <path> # pick a monorepo workspace
9
- *
10
- * The boot check in context.mjs reports what a session can afford to measure.
11
- * This runs everything: git drift, per-workspace sweep, ignore-list validation
12
- * against the live rule registry, hook script resolution.
13
- *
14
- * `--fix` is deliberately narrow. It performs only the migrations marked
15
- * severity 'auto', the ones with no judgment in them: stamp the product record,
16
- * move a sidecar out of a retired location. Anything that needs an answer from
17
- * the user (a platform value, whether an inherited record still describes an
18
- * app, whether a document has drifted from the code) is reported and left
19
- * alone. Exit code is 0 unless the run itself failed; findings are not errors.
20
- */
21
-
22
- import fs from 'node:fs';
23
- import path from 'node:path';
24
- import { fileURLToPath } from 'node:url';
25
-
26
- import { loadContext, extractPlatform, resolveTargetSelection } from './context.mjs';
27
- import { parseTargetOptions } from './lib/target-args.mjs';
28
- import { IMPECCABLE_COMMAND, IMPECCABLE_PROVIDER_ID } from './lib/provider.mjs';
29
- import { parseDesignMd } from './lib/design-parser.mjs';
30
- import {
31
- PRODUCT_SCHEMA_VERSION,
32
- readProductSchemaVersion,
33
- stampProductSchema,
34
- } from './lib/artifact-schema.mjs';
35
- import {
36
- collectBootFindingGroups,
37
- checkNativePlatformEvidence,
38
- designSidecarCandidatesFor,
39
- } from './lib/staleness.mjs';
40
- import {
41
- checkDesignCoverage,
42
- checkDesignDrift,
43
- checkDetectorIgnores,
44
- checkHookInstallation,
45
- checkLegacyLiveState,
46
- checkWorkspaces,
47
- loadKnownRuleIds,
48
- } from './lib/staleness-deep.mjs';
49
-
50
- const SCRIPTS_DIR = path.dirname(fileURLToPath(import.meta.url));
51
-
52
- function safeRead(filePath) {
53
- try {
54
- return fs.readFileSync(filePath, 'utf-8');
55
- } catch {
56
- return null;
57
- }
58
- }
59
-
60
- function parseArgs(argv) {
61
- const passthrough = [];
62
- const flags = { json: false, fix: false, help: false };
63
- for (const arg of argv) {
64
- if (arg === '--json') flags.json = true;
65
- else if (arg === '--fix') flags.fix = true;
66
- else if (arg === '--help' || arg === '-h') flags.help = true;
67
- else passthrough.push(arg);
68
- }
69
- return { flags, targetOptions: parseTargetOptions(passthrough, { strict: true }) };
70
- }
71
-
72
- function usage() {
73
- return [
74
- `Usage: node doctor.mjs [--json] [--fix] [--target <path>]`,
75
- '',
76
- "Report drift between this project's Impeccable artifacts and what the",
77
- 'installed version reads: PRODUCT.md, DESIGN.md and its sidecar,',
78
- '.impeccable/config.json, surface briefs, and the design hook.',
79
- '',
80
- ' --json Emit findings as JSON.',
81
- ' --fix Apply the mechanical migrations (severity "auto") only.',
82
- ' --target <path> Select a workspace in a monorepo.',
83
- ].join('\n');
84
- }
85
-
86
- async function collect(cwd, targetOptions) {
87
- const ctx = loadContext(cwd, targetOptions);
88
- const projectRoot = ctx.projectRoot || cwd;
89
- const absProductPath = ctx.productPath ? path.resolve(cwd, ctx.productPath) : null;
90
- const absDesignPath = ctx.designPath ? path.resolve(cwd, ctx.designPath) : null;
91
- const sidecarCandidates = designSidecarCandidatesFor(projectRoot, ctx.contextDir);
92
- const knownRuleIds = await loadKnownRuleIds(SCRIPTS_DIR);
93
-
94
- const selection = resolveTargetSelection(cwd, targetOptions);
95
- const workspaceCandidates = selection?.targetCandidates || [];
96
-
97
- const workspaceResult = checkWorkspaces({
98
- repoRoot: ctx.repoRoot,
99
- candidates: workspaceCandidates,
100
- checkNativePlatformEvidence,
101
- extractPlatform,
102
- readFile: safeRead,
103
- });
104
- const bootFindings = collectBootFindingGroups(ctx, {
105
- absDesignPath,
106
- sidecarCandidates,
107
- projectRootPatterns: readProjectRootPatterns(ctx.repoRoot),
108
- targetCandidates: workspaceCandidates,
109
- });
110
-
111
- const findings = [
112
- ...bootFindings.product,
113
- ...bootFindings.nativePlatform,
114
- ...bootFindings.designSidecar,
115
- ...checkDesignDrift({ designPath: absDesignPath, projectRoot }),
116
- ...checkDesignCoverage({ design: ctx.design, designPath: ctx.designPath, parseDesignMd }),
117
- ...bootFindings.config,
118
- ...bootFindings.buildPath,
119
- ...checkDetectorIgnores({ projectRoot, knownRuleIds }),
120
- ...bootFindings.surfaceBriefs,
121
- ...checkHookInstallation({
122
- projectRoot,
123
- repoRoot: ctx.repoRoot,
124
- providerId: IMPECCABLE_PROVIDER_ID,
125
- }),
126
- ...checkLegacyLiveState({ projectRoot }),
127
- ...bootFindings.projectRoots,
128
- ...workspaceResult.findings,
129
- ];
130
-
131
- return {
132
- ctx,
133
- projectRoot,
134
- absProductPath,
135
- sidecarCandidates,
136
- findings,
137
- workspaces: workspaceResult.workspaces,
138
- ruleRegistryAvailable: knownRuleIds !== null,
139
- };
140
- }
141
-
142
- // Read straight from disk rather than importing context.mjs's private reader.
143
- // Only the positive/negative pattern strings matter here.
144
- function readProjectRootPatterns(repoRoot) {
145
- if (!repoRoot) return [];
146
- const patterns = [];
147
- for (const name of ['config.json', 'config.local.json']) {
148
- try {
149
- const raw = JSON.parse(fs.readFileSync(path.join(repoRoot, '.impeccable', name), 'utf-8'));
150
- if (Array.isArray(raw?.projectRoots)) {
151
- for (const entry of raw.projectRoots) {
152
- if (typeof entry === 'string' && entry.trim()) patterns.push(entry.trim());
153
- }
154
- }
155
- } catch { /* missing or malformed: nothing to check */ }
156
- }
157
- return patterns;
158
- }
159
-
160
- /**
161
- * Apply the migrations that carry no decision. Returns what was done and what
162
- * was deliberately left for the user.
163
- */
164
- function applyFixes(report) {
165
- const applied = [];
166
- const skipped = [];
167
-
168
- for (const entry of report.findings) {
169
- if (entry.severity !== 'auto') {
170
- skipped.push({ id: entry.id, reason: 'needs a decision from the user' });
171
- continue;
172
- }
173
- if (entry.id === 'design-sidecar-legacy-path') {
174
- const canonical = report.sidecarCandidates[0];
175
- const present = report.sidecarCandidates.find((candidate) => fs.existsSync(candidate));
176
- if (!canonical || !present || path.resolve(canonical) === path.resolve(present)) continue;
177
- if (fs.existsSync(canonical)) {
178
- skipped.push({ id: entry.id, reason: `${rel(canonical, report.projectRoot)} already exists; not overwriting` });
179
- continue;
180
- }
181
- fs.mkdirSync(path.dirname(canonical), { recursive: true });
182
- fs.renameSync(present, canonical);
183
- applied.push(`Moved ${rel(present, report.projectRoot)} to ${rel(canonical, report.projectRoot)}.`);
184
- continue;
185
- }
186
- if (entry.id === 'legacy-live-state') {
187
- // Reported, never deleted here: a running live session still reads these,
188
- // and losing session state to a doctor run is a worse outcome than a
189
- // stale file. The report says what to remove and when.
190
- skipped.push({ id: entry.id, reason: 'delete by hand once no live session is running' });
191
- continue;
192
- }
193
- skipped.push({ id: entry.id, reason: 'no automatic migration implemented' });
194
- }
195
-
196
- // Stamping the product record is additive and safe, and it is what stops a
197
- // later version proposing an interview the user has already sat through.
198
- const productPath = report.absProductPath;
199
- if (productPath && report.ctx.product && readProductSchemaVersion(report.ctx.product) === null
200
- && !report.findings.some((entry) => entry.id === 'product-schema-legacy')) {
201
- fs.writeFileSync(productPath, stampProductSchema(report.ctx.product), 'utf-8');
202
- applied.push(`Stamped ${rel(productPath, report.projectRoot)} as product-schema ${PRODUCT_SCHEMA_VERSION}.`);
203
- }
204
-
205
- return { applied, skipped };
206
- }
207
-
208
- function rel(filePath, root) {
209
- const value = path.relative(root, filePath);
210
- return value && !value.startsWith('..') ? value.split(path.sep).join('/') : filePath;
211
- }
212
-
213
- const SEVERITY_LABEL = {
214
- auto: 'automatic',
215
- mention: 'worth saying',
216
- route: 'needs a command',
217
- };
218
-
219
- function renderText(report, fixes) {
220
- const lines = [];
221
- const { findings } = report;
222
-
223
- lines.push(`Impeccable doctor: ${rel(report.projectRoot, process.cwd()) || '.'}`);
224
- if (report.ctx.isMonorepo) {
225
- lines.push(`Monorepo, repo root ${rel(report.ctx.repoRoot, process.cwd()) || '.'}.`);
226
- }
227
- lines.push('');
228
-
229
- if (!findings.length) {
230
- lines.push('No drift found. Every artifact matches what this version reads.');
231
- } else {
232
- const order = ['route', 'mention', 'auto'];
233
- for (const severity of order) {
234
- const group = findings.filter((entry) => entry.severity === severity);
235
- if (!group.length) continue;
236
- lines.push(`${SEVERITY_LABEL[severity]} (${group.length}):`);
237
- for (const entry of group) {
238
- lines.push(` ${entry.id}${entry.path ? ` [${entry.path}]` : ''}`);
239
- lines.push(` ${entry.summary}`);
240
- lines.push(` → ${entry.fix}`);
241
- }
242
- lines.push('');
243
- }
244
- }
245
-
246
- if (report.workspaces.length) {
247
- lines.push('Workspaces:');
248
- for (const workspace of report.workspaces) {
249
- lines.push(` ${workspace.path} product: ${workspace.productStatus}`
250
- + ` design: ${workspace.designStatus}`
251
- + `${workspace.platform ? ` platform: ${workspace.platform}` : ''}`);
252
- }
253
- lines.push('');
254
- }
255
-
256
- if (!report.ruleRegistryAvailable) {
257
- lines.push('Note: the bundled detector could not be resolved, so ignored rule ids were not validated.');
258
- lines.push('');
259
- }
260
-
261
- if (fixes) {
262
- lines.push(fixes.applied.length ? 'Applied:' : 'Applied nothing.');
263
- for (const entry of fixes.applied) lines.push(` ${entry}`);
264
- const held = fixes.skipped.filter((entry) => entry.reason !== 'needs a decision from the user');
265
- if (held.length) {
266
- lines.push('Left alone:');
267
- for (const entry of held) lines.push(` ${entry.id}: ${entry.reason}`);
268
- }
269
- } else if (findings.some((entry) => entry.severity === 'auto')) {
270
- lines.push(`Run \`node doctor.mjs --fix\` to apply the automatic migrations, `
271
- + `or \`${IMPECCABLE_COMMAND} doctor\` to work through all of them.`);
272
- }
273
-
274
- return lines.join('\n');
275
- }
276
-
277
- async function cli() {
278
- let parsed;
279
- try {
280
- parsed = parseArgs(process.argv.slice(2));
281
- } catch (err) {
282
- process.stderr.write(`${err.message}\n`);
283
- process.exit(1);
284
- }
285
- if (parsed.flags.help) {
286
- process.stdout.write(`${usage()}\n`);
287
- return;
288
- }
289
-
290
- const report = await collect(process.cwd(), parsed.targetOptions);
291
- const fixes = parsed.flags.fix ? applyFixes(report) : null;
292
-
293
- if (parsed.flags.json) {
294
- process.stdout.write(`${JSON.stringify({
295
- projectRoot: report.projectRoot,
296
- repoRoot: report.ctx.repoRoot,
297
- isMonorepo: report.ctx.isMonorepo,
298
- productPath: report.ctx.productPath,
299
- designPath: report.ctx.designPath,
300
- platform: report.ctx.platform,
301
- ruleRegistryAvailable: report.ruleRegistryAvailable,
302
- findings: report.findings,
303
- workspaces: report.workspaces,
304
- ...(fixes ? { fixes } : {}),
305
- }, null, 2)}\n`);
306
- return;
307
- }
308
-
309
- process.stdout.write(`${renderText(report, fixes)}\n`);
310
- }
311
-
312
- function invokedAsScript() {
313
- const arg = process.argv[1];
314
- if (!arg) return false;
315
- try {
316
- return fs.realpathSync(arg) === fs.realpathSync(fileURLToPath(import.meta.url));
317
- } catch {
318
- return false;
319
- }
320
- }
321
-
322
- if (invokedAsScript()) {
323
- cli().catch((err) => {
324
- process.stderr.write(`impeccable doctor failed: ${err?.message || err}\n`);
325
- process.exit(1);
326
- });
327
- }
328
-
329
- export { collect, applyFixes, renderText };