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,533 +0,0 @@
1
- /**
2
- * Staleness detection for Impeccable's own project artifacts: PRODUCT.md,
3
- * DESIGN.md and its `.impeccable/design.json` sidecar, `.impeccable/config.json`,
4
- * and persisted surface briefs.
5
- *
6
- * Three kinds of drift live under "out of date", and they want different
7
- * handling:
8
- *
9
- * 1. Tool version drift. The installed skill is older than the published one.
10
- * Owned by computeUpdateDirective in context.mjs, not by this module.
11
- * 2. Schema drift. An artifact was written by an older Impeccable: fields it
12
- * no longer reads, fields it now expects, files in retired locations.
13
- * Deterministic, and mostly fixable without asking anyone.
14
- * 3. Truth drift. The code moved on and the document no longer describes it.
15
- * Not mechanical. `document` and `init` own the rewrite; the most this
16
- * module does is measure a proxy and name it as a proxy.
17
- *
18
- * Two tiers, because the boot path runs on every session:
19
- *
20
- * Tier 1 (collectBootFindings) spends only what a boot already spends. It
21
- * parses markdown context.mjs has in memory, stats a bounded set of paths,
22
- * and reads the two small JSON files the boot reads anyway. No directory
23
- * walks, no git, no cross-workspace sweep.
24
- *
25
- * Tier 2 (the doctor pass) is on demand and may walk, shell out to git, and
26
- * compare declared tokens against real CSS.
27
- *
28
- * Findings are data, not prose, so both tiers and the JSON output render the
29
- * same set. Severity says what should happen, not how bad it is:
30
- *
31
- * 'auto' fix it silently the next time that file is written anyway
32
- * 'mention' state it once, offer the fix, carry on with the user's task
33
- * 'route' needs a specific command, so name the command and the gap
34
- */
35
-
36
- import fs from 'node:fs';
37
- import path from 'node:path';
38
-
39
- import {
40
- PRODUCT_SCHEMA_VERSION,
41
- PRODUCT_DEPRECATED_SECTIONS,
42
- PRODUCT_V4_SECTIONS,
43
- DESIGN_SIDECAR_SCHEMA_VERSION,
44
- readProductSchemaVersion,
45
- readSidecarSchemaVersion,
46
- } from './artifact-schema.mjs';
47
-
48
- // Top-level keys any reader honors: `hook` and `detector` subtrees (hook-lib's
49
- // readConfig), `updateCheck` (context.mjs), `projectRoots` (context.mjs's
50
- // monorepo resolution), `buildPath` (context.mjs's build-path directive), plus
51
- // `stalenessCheck` below. `$schema` and `version` are allowed as conventional
52
- // metadata nobody reads.
53
- const KNOWN_CONFIG_KEYS = new Set([
54
- 'hook',
55
- 'detector',
56
- 'updateCheck',
57
- 'stalenessCheck',
58
- 'projectRoots',
59
- 'buildPath',
60
- '$schema',
61
- 'version',
62
- ]);
63
-
64
- // The only two values context.mjs and new-work honor. A near miss reads as a
65
- // working preference and silently rides the opposite path, so it is worth
66
- // reporting rather than coercing.
67
- const BUILD_PATH_VALUES = Object.freeze(['comp', 'code']);
68
-
69
- // Evidence that this project does the kind of work `buildPath` governs. A
70
- // project that only ever ran polish or audit has no use for the setting and
71
- // should never be told it exists. Two stats, so Tier 1 can afford it.
72
- const DIRECTION_WORK_PATHS = Object.freeze([
73
- path.join('.impeccable', 'surfaces'),
74
- path.join('.impeccable', 'mocks', 'decision'),
75
- ]);
76
-
77
- // `detector` is a closed set, so a typo here is worth reporting. `hook` is not
78
- // checked: it carries runtime settings from several writers and the false
79
- // positive rate would outweigh the catch.
80
- const KNOWN_DETECTOR_KEYS = new Set([
81
- 'ignoreRules',
82
- 'ignoreFiles',
83
- 'ignoreValues',
84
- 'designSystem',
85
- 'extensions',
86
- ]);
87
-
88
- // Evidence that a project ships a native app. Checked only to catch a
89
- // PRODUCT.md that says web (or says nothing, which resolves to web) on a
90
- // project that is plainly not: that combination silently skips the iOS and
91
- // Android references for the whole session.
92
- const NATIVE_EVIDENCE_PATHS = Object.freeze([
93
- { rel: 'pubspec.yaml', platform: 'adaptive', reason: 'a Flutter pubspec.yaml' },
94
- { rel: 'ios/Podfile', platform: 'ios', reason: 'an ios/Podfile' },
95
- { rel: 'android/build.gradle', platform: 'android', reason: 'an android/build.gradle' },
96
- { rel: 'android/build.gradle.kts', platform: 'android', reason: 'an android/build.gradle.kts' },
97
- { rel: 'ios/Runner.xcodeproj', platform: 'ios', reason: 'an ios/Runner.xcodeproj' },
98
- ]);
99
-
100
- const NATIVE_EVIDENCE_DEPENDENCIES = Object.freeze([
101
- { name: 'react-native', platform: 'adaptive', reason: 'a react-native dependency' },
102
- { name: 'expo', platform: 'adaptive', reason: 'an expo dependency' },
103
- { name: '@react-native/metro-config', platform: 'adaptive', reason: 'a React Native metro config dependency' },
104
- ]);
105
-
106
- function finding({ id, artifact, filePath = null, severity, summary, fix }) {
107
- return { id, artifact, path: filePath, severity, summary, fix };
108
- }
109
-
110
- /**
111
- * Every location a design sidecar may live, canonical first. Pure so that both
112
- * impeccable-paths (which resolves the project root) and context.mjs (which
113
- * cannot import impeccable-paths without a cycle) share one definition of
114
- * where the retired locations are.
115
- */
116
- export function designSidecarCandidatesFor(projectRoot, contextDir = projectRoot) {
117
- const candidates = [
118
- path.join(projectRoot, '.impeccable', 'design.json'),
119
- path.join(projectRoot, 'DESIGN.json'),
120
- ];
121
- const contextLegacy = path.join(contextDir || projectRoot, 'DESIGN.json');
122
- if (!candidates.includes(contextLegacy)) candidates.push(contextLegacy);
123
- return candidates;
124
- }
125
-
126
- function readJson(filePath) {
127
- try {
128
- return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
129
- } catch {
130
- return null;
131
- }
132
- }
133
-
134
- function mtimeMs(filePath) {
135
- try {
136
- return fs.statSync(filePath).mtimeMs;
137
- } catch {
138
- return null;
139
- }
140
- }
141
-
142
- function hasSection(markdown, heading) {
143
- const escaped = heading.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
144
- return new RegExp(`^##\\s+${escaped}\\s*$`, 'im').test(String(markdown || ''));
145
- }
146
-
147
- function toRelative(filePath, root) {
148
- if (!filePath) return null;
149
- const rel = path.relative(root, filePath);
150
- return rel && !rel.startsWith('..') && !path.isAbsolute(rel)
151
- ? rel.split(path.sep).join('/')
152
- : filePath;
153
- }
154
-
155
- // ─── PRODUCT.md ────────────────────────────────────────────────────────────
156
-
157
- /**
158
- * Pure: schema drift visible in a PRODUCT.md body. `productPath` is used for
159
- * reporting only.
160
- */
161
- export function checkProduct(product, productPath = 'PRODUCT.md') {
162
- if (!product) return [];
163
- const findings = [];
164
-
165
- for (const [heading, reason] of Object.entries(PRODUCT_DEPRECATED_SECTIONS)) {
166
- if (!hasSection(product, heading)) continue;
167
- findings.push(finding({
168
- id: `product-deprecated-${heading.toLowerCase()}`,
169
- artifact: 'PRODUCT.md',
170
- filePath: productPath,
171
- severity: 'mention',
172
- summary: `PRODUCT.md still carries a \`## ${heading}\` section. ${reason}`,
173
- fix: `Treat \`## ${heading}\` as absent for every decision this session. `
174
- + 'Offer to delete the section; do not let its value influence the work either way.',
175
- }));
176
- }
177
-
178
- const stamped = readProductSchemaVersion(product);
179
- if (stamped === null && !PRODUCT_V4_SECTIONS.some((section) => hasSection(product, section))) {
180
- findings.push(finding({
181
- id: 'product-schema-legacy',
182
- artifact: 'PRODUCT.md',
183
- filePath: productPath,
184
- severity: 'route',
185
- summary: 'PRODUCT.md has no schema stamp and none of the sections the current record adds '
186
- + `(${PRODUCT_V4_SECTIONS.join(', ')}), so it predates this version of the product record.`,
187
- fix: 'Offer `init`, which preserves confirmed answers and fills the gaps by interview. '
188
- + 'Do not rewrite the file from inference.',
189
- }));
190
- } else if (stamped !== null && stamped < PRODUCT_SCHEMA_VERSION) {
191
- findings.push(finding({
192
- id: 'product-schema-outdated',
193
- artifact: 'PRODUCT.md',
194
- filePath: productPath,
195
- severity: 'route',
196
- summary: `PRODUCT.md is stamped product-schema ${stamped}; the current record is ${PRODUCT_SCHEMA_VERSION}.`,
197
- fix: 'Offer `init` to bring the record current, preserving confirmed answers.',
198
- }));
199
- }
200
-
201
- return findings;
202
- }
203
-
204
- /**
205
- * A project that resolves to web while carrying native build files. Bounded:
206
- * a handful of stats plus one package.json read at the project root.
207
- */
208
- export function checkNativePlatformEvidence({ projectRoot, platform, product, productPath }) {
209
- if (!projectRoot) return [];
210
- // Only the web resolution is worth checking. An explicit native value is
211
- // already honored, and an unrecognized value already gets its own warning.
212
- if (platform && platform !== 'web') return [];
213
-
214
- const evidence = [];
215
- for (const entry of NATIVE_EVIDENCE_PATHS) {
216
- if (fs.existsSync(path.join(projectRoot, entry.rel))) evidence.push(entry);
217
- }
218
- const pkg = readJson(path.join(projectRoot, 'package.json'));
219
- if (pkg) {
220
- const deps = { ...(pkg.dependencies || {}), ...(pkg.devDependencies || {}) };
221
- for (const entry of NATIVE_EVIDENCE_DEPENDENCIES) {
222
- if (deps[entry.name]) evidence.push(entry);
223
- }
224
- }
225
- if (!evidence.length) return [];
226
-
227
- const platforms = new Set(evidence.map((entry) => entry.platform));
228
- const suggested = platforms.size > 1 || platforms.has('adaptive')
229
- ? 'adaptive'
230
- : [...platforms][0];
231
- const declared = platform === 'web'
232
- ? 'PRODUCT.md declares `## Platform: web`'
233
- : product
234
- ? 'PRODUCT.md has no `## Platform` section, so the project resolves to web'
235
- : 'no PRODUCT.md declares a platform, so the project resolves to web';
236
-
237
- return [finding({
238
- id: 'platform-native-evidence',
239
- artifact: 'PRODUCT.md',
240
- filePath: productPath || null,
241
- severity: 'mention',
242
- summary: `${declared}, but the project carries ${evidence.map((entry) => entry.reason).join(' and ')}. `
243
- + 'Web guidance is being applied to a native codebase, and the iOS and Android references never load.',
244
- fix: `Ask the user whether \`## Platform\` should be \`${suggested}\`. `
245
- + 'If it should, write the value and load the matching native reference before designing.',
246
- })];
247
- }
248
-
249
- // ─── DESIGN.md and the design.json sidecar ─────────────────────────────────
250
-
251
- /**
252
- * Sidecar drift: retired location, schema version behind, or older than the
253
- * DESIGN.md it extends. Costs three stats and one small JSON read.
254
- *
255
- * `sidecarCandidates` comes from impeccable-paths' resolver so this module
256
- * stays out of the business of knowing where sidecars may live; the first
257
- * entry is the canonical location.
258
- */
259
- export function checkDesignSidecar({ designPath, sidecarCandidates = [], projectRoot }) {
260
- const findings = [];
261
- const canonical = sidecarCandidates[0] || null;
262
- const present = sidecarCandidates.find((candidate) => fs.existsSync(candidate)) || null;
263
- if (!present) return findings;
264
-
265
- const relPresent = toRelative(present, projectRoot);
266
-
267
- if (canonical && path.resolve(present) !== path.resolve(canonical)) {
268
- findings.push(finding({
269
- id: 'design-sidecar-legacy-path',
270
- artifact: 'design.json',
271
- filePath: relPresent,
272
- severity: 'auto',
273
- summary: `The design sidecar sits at ${relPresent}, a location kept only for backward compatibility.`,
274
- fix: `Move it to ${toRelative(canonical, projectRoot)} the next time the sidecar is written. `
275
- + 'No user decision is needed.',
276
- }));
277
- }
278
-
279
- const sidecar = readJson(present);
280
- const schemaVersion = readSidecarSchemaVersion(sidecar);
281
- if (sidecar && (schemaVersion === null || schemaVersion < DESIGN_SIDECAR_SCHEMA_VERSION)) {
282
- findings.push(finding({
283
- id: 'design-sidecar-schema-outdated',
284
- artifact: 'design.json',
285
- filePath: relPresent,
286
- severity: 'route',
287
- summary: `${relPresent} is schemaVersion ${schemaVersion === null ? 'unset' : schemaVersion}; `
288
- + `the current sidecar is ${DESIGN_SIDECAR_SCHEMA_VERSION}. Token primitives moved to the DESIGN.md `
289
- + 'frontmatter, so the old shape carries values that are now read from two places.',
290
- fix: 'Offer `document` to regenerate the sidecar. It reads the existing DESIGN.md, so no interview is needed.',
291
- }));
292
- }
293
-
294
- if (designPath) {
295
- const designMtime = mtimeMs(designPath);
296
- const sidecarMtime = mtimeMs(present);
297
- if (designMtime !== null && sidecarMtime !== null && designMtime > sidecarMtime) {
298
- findings.push(finding({
299
- id: 'design-sidecar-stale',
300
- artifact: 'design.json',
301
- filePath: relPresent,
302
- severity: 'mention',
303
- summary: `DESIGN.md was edited after ${relPresent} was generated, so the sidecar's ramps, `
304
- + 'shadows, motion tokens, and component snippets may contradict it.',
305
- fix: 'Offer `document` to refresh the sidecar, preserving DESIGN.md.',
306
- }));
307
- }
308
- }
309
-
310
- return findings;
311
- }
312
-
313
- // ─── .impeccable/config.json ───────────────────────────────────────────────
314
-
315
- /**
316
- * Unrecognized keys in the shared and local configs. A key nothing reads is
317
- * indistinguishable from a working setting until someone checks, which is how
318
- * a singular `ignoreRule` silences nothing for months.
319
- */
320
- export function checkConfig({ projectRoot, repoRoot }) {
321
- const findings = [];
322
- const roots = [...new Set([projectRoot, repoRoot].filter(Boolean).map((root) => path.resolve(root)))];
323
- for (const root of roots) {
324
- for (const name of ['config.json', 'config.local.json']) {
325
- const filePath = path.join(root, '.impeccable', name);
326
- const raw = readJson(filePath);
327
- if (!raw || typeof raw !== 'object' || Array.isArray(raw)) continue;
328
- const rel = toRelative(filePath, projectRoot || root);
329
-
330
- const unknownTop = Object.keys(raw).filter((key) => !KNOWN_CONFIG_KEYS.has(key));
331
- if (unknownTop.length) {
332
- findings.push(finding({
333
- id: 'config-unknown-keys',
334
- artifact: 'config.json',
335
- filePath: rel,
336
- severity: 'mention',
337
- summary: `${rel} has top-level key(s) nothing reads: ${unknownTop.map((key) => `\`${key}\``).join(', ')}. `
338
- + `Recognized keys are ${[...KNOWN_CONFIG_KEYS].map((key) => `\`${key}\``).join(', ')}.`,
339
- fix: 'Report the exact keys to the user. A near-miss of a real key is a setting that has never applied.',
340
- }));
341
- }
342
-
343
- if (Object.prototype.hasOwnProperty.call(raw, 'buildPath')
344
- && !BUILD_PATH_VALUES.includes(raw.buildPath)) {
345
- findings.push(finding({
346
- id: 'config-invalid-build-path',
347
- artifact: 'config.json',
348
- filePath: rel,
349
- severity: 'mention',
350
- summary: `${rel} sets \`buildPath\` to ${JSON.stringify(raw.buildPath)}, which nothing reads. `
351
- + `The values are ${BUILD_PATH_VALUES.map((value) => `\`${value}\``).join(' and ')}.`,
352
- fix: 'Report the value. An unread `buildPath` does not fall back to the other path; '
353
- + 'it falls back to the default, so a project meaning `code` has been building comp-led.',
354
- }));
355
- }
356
-
357
- const detector = raw.detector;
358
- if (detector && typeof detector === 'object' && !Array.isArray(detector)) {
359
- const unknownDetector = Object.keys(detector).filter((key) => !KNOWN_DETECTOR_KEYS.has(key));
360
- if (unknownDetector.length) {
361
- findings.push(finding({
362
- id: 'config-unknown-detector-keys',
363
- artifact: 'config.json',
364
- filePath: rel,
365
- severity: 'mention',
366
- summary: `${rel} has \`detector\` key(s) nothing reads: ${unknownDetector.map((key) => `\`${key}\``).join(', ')}. `
367
- + `Recognized keys are ${[...KNOWN_DETECTOR_KEYS].map((key) => `\`${key}\``).join(', ')}.`,
368
- fix: 'Report the exact keys. `ignoreRule` for `ignoreRules` is the common one, and it silences nothing.',
369
- }));
370
- }
371
- }
372
- }
373
- }
374
- return findings;
375
- }
376
-
377
- /**
378
- * No recorded build-path preference on a project that plainly does visual
379
- * direction work. Not drift in the usual sense: the setting is newer than the
380
- * project, so every project that predates it lands here at once. That is why
381
- * it is gated twice, on a product record and on evidence of the work the
382
- * setting governs, and why it says the choice rather than assuming a harness
383
- * can make it. Image generation is the real precondition and this module
384
- * cannot see it: a harness-native image tool leaves no trace on disk, so the
385
- * finding hands the question to the one reader that knows.
386
- */
387
- export function checkBuildPathUnset({ projectRoot, repoRoot, product }) {
388
- if (!projectRoot || !product) return [];
389
- const roots = [...new Set([projectRoot, repoRoot].filter(Boolean).map((root) => path.resolve(root)))];
390
-
391
- for (const root of roots) {
392
- for (const name of ['config.json', 'config.local.json']) {
393
- const raw = readJson(path.join(root, '.impeccable', name));
394
- // Any declared value ends this, valid or not: an invalid one already has
395
- // its own finding and two reports of one key is noise.
396
- if (raw && Object.prototype.hasOwnProperty.call(raw, 'buildPath')) return [];
397
- }
398
- }
399
-
400
- const evidence = DIRECTION_WORK_PATHS.filter((rel) => fs.existsSync(path.join(projectRoot, rel)));
401
- if (!evidence.length) return [];
402
-
403
- return [finding({
404
- id: 'config-build-path-unset',
405
- artifact: 'config.json',
406
- filePath: '.impeccable/config.json',
407
- severity: 'mention',
408
- summary: 'This project has run visual direction work but records no `buildPath`, '
409
- + 'so every direction round takes the comp-first default without anyone having chosen it.',
410
- fix: 'Only when image generation exists in your tool surface, offer the choice once: '
411
- + '**comp-first** (an image sets the bar before any code; bolder composition, slower) or '
412
- + '**code-first** (build directly; ambition carried by the direction contract; leaner, faster). '
413
- + 'Write the answer to `.impeccable/config.json` as `"buildPath": "comp"` or `"buildPath": "code"`, '
414
- + 'merging with the keys already there. Without image generation there is no choice to record: stay silent.',
415
- })];
416
- }
417
-
418
- // ─── Surface briefs ────────────────────────────────────────────────────────
419
-
420
- /**
421
- * A brief whose primary target no longer exists still resolves and still gets
422
- * injected as authority for a surface that is gone. Route and URL targets have
423
- * no file to check and are skipped.
424
- */
425
- export function checkSurfaceBriefs({ candidates = [], projectRoot }) {
426
- if (!projectRoot) return [];
427
- const orphaned = [];
428
- for (const brief of candidates) {
429
- const target = brief?.primaryTarget;
430
- if (!target || typeof target !== 'string') continue;
431
- if (/^https?:\/\//i.test(target) || target.startsWith('route:')) continue;
432
- if (!fs.existsSync(path.join(projectRoot, target))) orphaned.push(brief);
433
- }
434
- if (!orphaned.length) return [];
435
- return [finding({
436
- id: 'surface-brief-orphaned',
437
- artifact: 'surface brief',
438
- filePath: orphaned.map((brief) => brief.path).filter(Boolean).join(', ') || null,
439
- severity: 'mention',
440
- summary: `${orphaned.length} persisted surface brief(s) name a primary target that no longer exists: `
441
- + `${orphaned.map((brief) => `${brief.path} → ${brief.primaryTarget}`).join('; ')}.`,
442
- fix: 'Ask whether the surface moved (repoint the brief) or was removed (delete the brief). '
443
- + 'Until then the brief is authority for a file that is gone.',
444
- })];
445
- }
446
-
447
- // ─── Monorepo structure ────────────────────────────────────────────────────
448
-
449
- /**
450
- * `projectRoots` globs that match no directory. When every pattern misses,
451
- * candidate discovery returns nothing, the repo root silently becomes the
452
- * active project, and no other signal fires.
453
- *
454
- * Takes the candidate list rather than computing it: the boot path has already
455
- * paid for that walk, and this module must not pay for it twice.
456
- */
457
- export function checkProjectRoots({ patterns = [], candidates = [], configuredIn = '.impeccable/config.json' }) {
458
- const positive = patterns.filter((pattern) => pattern && !String(pattern).trim().startsWith('!'));
459
- if (!positive.length || candidates.length) return [];
460
- return [finding({
461
- id: 'config-project-roots-match-nothing',
462
- artifact: 'config.json',
463
- filePath: configuredIn,
464
- severity: 'mention',
465
- summary: `\`projectRoots\` declares ${positive.map((pattern) => `\`${pattern}\``).join(', ')}, `
466
- + 'but no directory matches any of them, so the repo root is being treated as the active project.',
467
- fix: 'Report the patterns and ask which directories they should name. A renamed workspace folder is the usual cause.',
468
- })];
469
- }
470
-
471
- /**
472
- * Workspaces that inherit the repo-root PRODUCT.md. Inheritance is a feature,
473
- * not a defect, so this is reported as information for the doctor pass rather
474
- * than emitted at boot: the judgment call is whether the inherited record
475
- * actually describes that app.
476
- */
477
- export function describeWorkspaceContext(candidates = []) {
478
- return candidates.map((candidate) => ({
479
- name: candidate.name,
480
- path: candidate.path,
481
- productStatus: candidate.productStatus,
482
- productPath: candidate.productPath,
483
- designStatus: candidate.designStatus,
484
- designPath: candidate.designPath,
485
- }));
486
- }
487
-
488
- // ─── Tier 1 orchestration ──────────────────────────────────────────────────
489
-
490
- /**
491
- * Everything a boot can afford, grouped by artifact so deeper reports can
492
- * interleave their own checks without rebuilding this policy. `ctx` is the
493
- * loadContext result; `extras` carries values the caller already computed so
494
- * nothing is recomputed here.
495
- */
496
- export function collectBootFindingGroups(ctx, extras = {}) {
497
- if (!ctx) return {};
498
- const projectRoot = ctx.projectRoot || process.cwd();
499
- const absDesignPath = extras.absDesignPath || null;
500
-
501
- return {
502
- product: checkProduct(ctx.product, ctx.productPath || 'PRODUCT.md'),
503
- // Only checked once a PRODUCT.md exists. Without one the boot already
504
- // emits NO_PRODUCT_MD and routes into init, which asks for the platform
505
- // directly; a second signal saying the same thing is noise.
506
- nativePlatform: ctx.product
507
- ? checkNativePlatformEvidence({
508
- projectRoot,
509
- platform: ctx.platform,
510
- product: ctx.product,
511
- productPath: ctx.productPath,
512
- })
513
- : [],
514
- designSidecar: checkDesignSidecar({
515
- designPath: absDesignPath,
516
- sidecarCandidates: extras.sidecarCandidates || [],
517
- projectRoot,
518
- }),
519
- config: checkConfig({ projectRoot, repoRoot: ctx.repoRoot }),
520
- buildPath: checkBuildPathUnset({ projectRoot, repoRoot: ctx.repoRoot, product: ctx.product }),
521
- surfaceBriefs: checkSurfaceBriefs({ candidates: ctx.surfaceBriefCandidates, projectRoot }),
522
- projectRoots: extras.projectRootPatterns
523
- ? checkProjectRoots({
524
- patterns: extras.projectRootPatterns,
525
- candidates: extras.targetCandidates || [],
526
- })
527
- : [],
528
- };
529
- }
530
-
531
- export function collectBootFindings(ctx, extras = {}) {
532
- return Object.values(collectBootFindingGroups(ctx, extras)).flat();
533
- }
@@ -1,149 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import { slugFromTarget } from './target-slug.mjs';
4
-
5
- export const SURFACE_BRIEF_VERSION = 1;
6
-
7
- export function getSurfaceBriefDir(projectRoot) {
8
- return path.join(projectRoot, '.impeccable', 'surfaces');
9
- }
10
-
11
- function normalizeRouteTarget(route) {
12
- if (!route.startsWith('/') || route.includes('..')) return null;
13
- const normalized = route.split(/[?#]/, 1)[0].replace(/\/{2,}/g, '/').replace(/\/$/, '') || '/';
14
- return `route:${normalized}`;
15
- }
16
-
17
- export function normalizeSurfaceTarget(target, { projectRoot = process.cwd() } = {}) {
18
- if (!target || typeof target !== 'string' || !target.trim()) return null;
19
- const trimmed = target.trim();
20
- if (/^https?:\/\//i.test(trimmed)) {
21
- try {
22
- const url = new URL(trimmed);
23
- url.hash = '';
24
- url.search = '';
25
- return url.toString().replace(/\/$/, '') || url.origin;
26
- } catch {
27
- return null;
28
- }
29
- }
30
- if (/^route:/i.test(trimmed)) return normalizeRouteTarget(trimmed.slice(trimmed.indexOf(':') + 1).trim());
31
- if (trimmed === '/') return normalizeRouteTarget(trimmed);
32
- if (trimmed.startsWith('/')) {
33
- const absolute = path.resolve(trimmed);
34
- const relativeToProject = path.relative(projectRoot, absolute);
35
- const isProjectFile = relativeToProject && !relativeToProject.startsWith('..') && !path.isAbsolute(relativeToProject);
36
- if (!isProjectFile && !fs.existsSync(absolute)) return normalizeRouteTarget(trimmed);
37
- }
38
- const abs = path.isAbsolute(trimmed) ? trimmed : path.resolve(projectRoot, trimmed);
39
- const rel = path.relative(projectRoot, abs);
40
- if (!rel || rel === '.' || rel.startsWith('..') || path.isAbsolute(rel)) return null;
41
- return rel.split(path.sep).join('/');
42
- }
43
-
44
- export function surfaceBriefPathForTarget(target, { projectRoot = process.cwd() } = {}) {
45
- const normalized = normalizeSurfaceTarget(target, { projectRoot });
46
- if (!normalized) return null;
47
- const slugInput = normalized.startsWith('route:') ? `route${normalized.slice('route:'.length)}` : normalized;
48
- const slug = slugFromTarget(slugInput, { cwd: projectRoot });
49
- return slug ? path.join(getSurfaceBriefDir(projectRoot), `${slug}.md`) : null;
50
- }
51
-
52
- export function parseSurfaceBrief(text, filePath = null) {
53
- const match = String(text || '').match(/^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/);
54
- const meta = {};
55
- if (match) {
56
- for (const line of match[1].split(/\r?\n/)) {
57
- const colon = line.indexOf(':');
58
- if (colon < 0) continue;
59
- const key = line.slice(0, colon).trim();
60
- const raw = line.slice(colon + 1).trim();
61
- if (!key) continue;
62
- if (/^(?:\[|\{|\")/.test(raw) || /^(?:true|false|null|-?\d+(?:\.\d+)?)$/.test(raw)) {
63
- try { meta[key] = JSON.parse(raw); continue; } catch { /* keep string */ }
64
- }
65
- meta[key] = raw.replace(/^['"]|['"]$/g, '');
66
- }
67
- }
68
- const primaryTarget = typeof meta.primary_target === 'string' ? meta.primary_target : null;
69
- const relatedTargets = Array.isArray(meta.related_targets)
70
- ? meta.related_targets.filter((value) => typeof value === 'string')
71
- : [];
72
- return {
73
- path: filePath,
74
- text: String(text || ''),
75
- body: match ? String(text || '').slice(match[0].length).trim() : String(text || '').trim(),
76
- meta,
77
- slug: typeof meta.slug === 'string' ? meta.slug : filePath ? path.basename(filePath, '.md') : null,
78
- primaryTarget,
79
- relatedTargets,
80
- targets: [primaryTarget, ...relatedTargets].filter(Boolean),
81
- };
82
- }
83
-
84
- export function listSurfaceBriefs(projectRoot = process.cwd()) {
85
- const dir = getSurfaceBriefDir(projectRoot);
86
- let names;
87
- try {
88
- names = fs.readdirSync(dir).filter((name) => name.endsWith('.md')).sort();
89
- } catch {
90
- return [];
91
- }
92
- return names.flatMap((name) => {
93
- const filePath = path.join(dir, name);
94
- try {
95
- return [parseSurfaceBrief(fs.readFileSync(filePath, 'utf-8'), filePath)];
96
- } catch {
97
- return [];
98
- }
99
- });
100
- }
101
-
102
- export function resolveSurfaceBrief(projectRoot = process.cwd(), target = null) {
103
- const briefs = listSurfaceBriefs(projectRoot);
104
- if (!target) {
105
- return {
106
- brief: briefs.length === 1 ? briefs[0] : null,
107
- candidates: briefs,
108
- reason: briefs.length === 1 ? 'only-brief' : briefs.length > 1 ? 'ambiguous' : 'none',
109
- };
110
- }
111
-
112
- const normalized = normalizeSurfaceTarget(target, { projectRoot });
113
- if (!normalized) return { brief: null, candidates: briefs, reason: 'invalid-target' };
114
- const exactPath = surfaceBriefPathForTarget(normalized, { projectRoot });
115
- const exact = briefs.find((brief) => brief.path === exactPath && (!brief.targets.length || brief.targets.includes(normalized)));
116
- if (exact) return { brief: exact, candidates: briefs, reason: 'slug' };
117
- const mapped = briefs.filter((brief) => brief.targets.includes(normalized));
118
- return {
119
- brief: mapped.length === 1 ? mapped[0] : null,
120
- candidates: mapped.length > 1 ? mapped : briefs,
121
- reason: mapped.length === 1 ? 'mapping' : mapped.length > 1 ? 'ambiguous-target' : 'not-found',
122
- };
123
- }
124
-
125
- export function writeSurfaceBrief({
126
- projectRoot = process.cwd(),
127
- primaryTarget,
128
- relatedTargets = [],
129
- body,
130
- }) {
131
- const normalizedPrimary = normalizeSurfaceTarget(primaryTarget, { projectRoot });
132
- if (!normalizedPrimary) throw new Error('surface brief requires a concrete project-relative primary target or URL');
133
- const normalizedRelated = [...new Set(relatedTargets
134
- .map((target) => normalizeSurfaceTarget(target, { projectRoot }))
135
- .filter((target) => target && target !== normalizedPrimary))];
136
- const slug = slugFromTarget(normalizedPrimary, { cwd: projectRoot });
137
- const filePath = surfaceBriefPathForTarget(normalizedPrimary, { projectRoot });
138
- fs.mkdirSync(path.dirname(filePath), { recursive: true });
139
- const frontmatter = [
140
- '---',
141
- `version: ${SURFACE_BRIEF_VERSION}`,
142
- `slug: ${JSON.stringify(slug)}`,
143
- `primary_target: ${JSON.stringify(normalizedPrimary)}`,
144
- `related_targets: ${JSON.stringify(normalizedRelated)}`,
145
- '---',
146
- ].join('\n');
147
- fs.writeFileSync(filePath, `${frontmatter}\n\n${String(body || '').trim()}\n`, 'utf-8');
148
- return filePath;
149
- }