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,473 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Critique persistence helper.
4
- *
5
- * Each critique run writes a per-target snapshot to
6
- * .impeccable/critique/<timestamp>__<slug>.md
7
- * with a small YAML frontmatter carrying the score + P0/P1 counts.
8
- *
9
- * The polish workflow reads the latest matching snapshot at start as its
10
- * fix backlog. No other skill auto-reads critique output.
11
- *
12
- * The slug is derived mechanically from the *resolved* primary artifact
13
- * (file path or URL), never from the user's natural-language phrasing.
14
- * Slug stability across runs is what lets the trend display work.
15
- *
16
- * CLI entry points (called from skill instructions):
17
- * node critique-storage.mjs slug <resolved-target>
18
- * node critique-storage.mjs write <slug> <snapshot-body-file>
19
- * node critique-storage.mjs latest <slug> [--json]
20
- * node critique-storage.mjs trend <slug> [limit]
21
- * node critique-storage.mjs close <resolved-target> <snapshot-file>
22
- *
23
- * Note: there is intentionally no `ignore` subcommand. ignore.md is a plain
24
- * markdown file; the model reads it directly with its file-read tool. This
25
- * helper only exists for operations the model can't trivially do inline
26
- * (normalizing paths, generating filenames, globbing + parsing frontmatter).
27
- */
28
-
29
- import fs from 'node:fs';
30
- import path from 'node:path';
31
- import { createHash } from 'node:crypto';
32
- import { fileURLToPath, pathToFileURL } from 'node:url';
33
- import { getCritiqueDir } from './lib/impeccable-paths.mjs';
34
- import { slugFromTarget } from './lib/target-slug.mjs';
35
-
36
- export { slugFromTarget } from './lib/target-slug.mjs';
37
-
38
- /**
39
- * Mechanically derive a slug from a resolved target. Returns null if the
40
- * input doesn't look like a stable identifier (empty, project root, etc).
41
- *
42
- * Accepts file paths and URLs. The model resolves "the homepage" to a
43
- * concrete artifact before calling this — we never slug a natural-language
44
- * phrase.
45
- */
46
- /**
47
- * Filename-safe UTC ISO timestamp: hyphens for separators, trailing Z.
48
- * Plain colons aren't allowed on Windows filesystems.
49
- */
50
- export function nowFilenameStamp(date = new Date()) {
51
- const iso = date.toISOString(); // 2026-05-12T18:30:00.123Z
52
- return iso.replace(/[:.]/g, '-').replace(/-\d+Z$/, 'Z');
53
- }
54
-
55
- /**
56
- * Return an exact content fingerprint for a local file target. URLs and
57
- * non-files return null because their content is not available here.
58
- *
59
- * The fingerprint deliberately describes bytes, not Git state or mtimes:
60
- * critique often assesses an uncommitted file, and a later polish run should
61
- * inherit that backlog when the bytes are unchanged regardless of staging.
62
- */
63
- function resolveLocalTargetPath(target, { cwd = process.cwd() } = {}) {
64
- if (!target || /^https?:\/\//i.test(target)) return null;
65
- return path.isAbsolute(target) ? path.resolve(target) : path.resolve(cwd, target);
66
- }
67
-
68
- function resolveTargetIdentity(target, { cwd = process.cwd() } = {}) {
69
- if (!target || typeof target !== 'string') return null;
70
- if (/^https?:\/\//i.test(target)) {
71
- try {
72
- const url = new URL(target);
73
- const pathname = url.pathname.replace(/\/+$/, '') || '/';
74
- return `url:${url.origin}${pathname}`;
75
- } catch {
76
- return null;
77
- }
78
- }
79
- const filePath = resolveLocalTargetPath(target, { cwd });
80
- return filePath ? `file:${filePath}` : null;
81
- }
82
-
83
- export function fingerprintTarget(target, { cwd = process.cwd() } = {}) {
84
- const filePath = resolveLocalTargetPath(target, { cwd });
85
- if (!filePath) return null;
86
- try {
87
- if (!fs.statSync(filePath).isFile()) return null;
88
- return `sha256:${createHash('sha256').update(fs.readFileSync(filePath)).digest('hex')}`;
89
- } catch {
90
- return null;
91
- }
92
- }
93
-
94
- /**
95
- * Write a snapshot for `slug`. `meta` carries the small structured frontmatter
96
- * keys read back by readTrend(). `body` is the human-readable critique
97
- * report (everything below the frontmatter).
98
- *
99
- * Returns the absolute path written.
100
- */
101
- export function writeSnapshot({ slug, meta, body, cwd = process.cwd(), now = new Date() }) {
102
- if (!slug) throw new Error('writeSnapshot requires a slug');
103
- const dir = getCritiqueDir(cwd);
104
- fs.mkdirSync(dir, { recursive: true });
105
- const timestamp = nowFilenameStamp(now);
106
- // Spread `meta` first so internally computed `timestamp` and `slug`
107
- // always win. Otherwise a caller-supplied meta blob (parsed from the
108
- // IMPECCABLE_CRITIQUE_META env var) could clobber them, leaving the
109
- // filename in disagreement with its frontmatter and corrupting trends.
110
- const front = serializeFrontmatter({ ...meta, timestamp, slug });
111
- const contents = `${front}\n${body.trim()}\n`;
112
-
113
- // A second critique can finish in the same UTC second. Use exclusive
114
- // creation and a fixed-width suffix so concurrent writers cannot replace
115
- // history and lexical ordering still keeps collision entries newest.
116
- for (let collision = 0; collision <= 9999; collision += 1) {
117
- const suffix = collision === 0 ? '' : `~${String(collision).padStart(4, '0')}`;
118
- const filePath = path.join(dir, `${timestamp}${suffix}__${slug}.md`);
119
- try {
120
- fs.writeFileSync(filePath, contents, { encoding: 'utf-8', flag: 'wx' });
121
- return filePath;
122
- } catch (error) {
123
- if (error?.code !== 'EEXIST') throw error;
124
- }
125
- }
126
- throw new Error(`Too many critique snapshots for ${slug} at ${timestamp}`);
127
- }
128
-
129
- function serializeFrontmatter(obj) {
130
- const lines = ['---'];
131
- for (const [key, value] of Object.entries(obj)) {
132
- if (value === undefined || value === null) continue;
133
- const str = typeof value === 'string' ? value : String(value);
134
- // Quote strings that contain : or # to keep parsing simple.
135
- const needsQuotes = typeof value === 'string' && /[:#]/.test(str);
136
- lines.push(`${key}: ${needsQuotes ? JSON.stringify(str) : str}`);
137
- }
138
- lines.push('---');
139
- return lines.join('\n');
140
- }
141
-
142
- function parseFrontmatter(text) {
143
- const match = text.match(/^---\r?\n([\s\S]*?)\r?\n---/);
144
- if (!match) return {};
145
- const out = {};
146
- for (const line of match[1].split(/\r?\n/)) {
147
- const colon = line.indexOf(':');
148
- if (colon < 0) continue;
149
- const key = line.slice(0, colon).trim();
150
- let value = line.slice(colon + 1).trim();
151
- if (/^".*"$/.test(value)) {
152
- try { value = JSON.parse(value); } catch { /* leave as-is */ }
153
- } else if (/^-?\d+$/.test(value)) {
154
- value = Number(value);
155
- } else if (value === 'true' || value === 'false') {
156
- value = value === 'true';
157
- }
158
- out[key] = value;
159
- }
160
- return out;
161
- }
162
-
163
- /**
164
- * Return snapshot files matching `suffix`, sorted oldest → newest.
165
- */
166
- const SNAPSHOT_FILENAME = /^\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}Z(?:~\d{4})?__.+\.md$/;
167
-
168
- function listSnapshots(suffix, cwd) {
169
- const dir = getCritiqueDir(cwd);
170
- if (!fs.existsSync(dir)) return [];
171
- return fs.readdirSync(dir)
172
- .filter((f) => SNAPSHOT_FILENAME.test(f) && f.endsWith(suffix))
173
- .sort()
174
- .map((f) => path.join(dir, f));
175
- }
176
-
177
- function readSnapshot(filePath) {
178
- if (!filePath) return null;
179
- const body = fs.readFileSync(filePath, 'utf-8');
180
- return { path: filePath, body, meta: parseFrontmatter(body) };
181
- }
182
-
183
- function snapshotTargetIdentity(snapshot) {
184
- const targetPath = snapshot?.meta.target_path;
185
- return snapshot?.meta.target_identity
186
- || (targetPath ? `file:${targetPath}` : null);
187
- }
188
-
189
- function readNewestSnapshot(slug, { cwd = process.cwd() } = {}) {
190
- return readSnapshot(listSnapshots(`__${slug}.md`, cwd).at(-1));
191
- }
192
-
193
- function readNewestSnapshotForIdentity(
194
- slug,
195
- targetIdentity,
196
- { cwd = process.cwd() } = {},
197
- ) {
198
- const matches = listSnapshots(`__${slug}.md`, cwd)
199
- .map(readSnapshot)
200
- .filter((snapshot) => snapshotTargetIdentity(snapshot) === targetIdentity);
201
- return matches.at(-1) || null;
202
- }
203
-
204
- /**
205
- * Return the most recent snapshot for `slug`, or null. Polish reads this
206
- * to find its fix backlog when the slug matches.
207
- */
208
- export function readLatestSnapshot(slug, { cwd = process.cwd() } = {}) {
209
- const latest = readNewestSnapshot(slug, { cwd });
210
- return latest?.meta.closed === true ? null : latest;
211
- }
212
-
213
- /**
214
- * Mark one exact snapshot closed without deleting the score history consumed
215
- * by `trend`. Exact identity matters: a newer critique may land after polish
216
- * reads its backlog, and that newer snapshot must remain live. `snapshotFile`
217
- * may be the absolute path returned by readLatestSnapshot() or the basename
218
- * emitted by `latest --json`. Returns the path marked closed, or null.
219
- */
220
- export function closeSnapshot(snapshotFile, { cwd = process.cwd() } = {}) {
221
- if (!snapshotFile || typeof snapshotFile !== 'string') return null;
222
- const dir = path.resolve(getCritiqueDir(cwd));
223
- const snapshotPath = path.isAbsolute(snapshotFile)
224
- ? path.resolve(snapshotFile)
225
- : path.resolve(dir, snapshotFile);
226
- const filename = path.basename(snapshotPath);
227
- if (
228
- path.dirname(snapshotPath) !== dir
229
- || !SNAPSHOT_FILENAME.test(filename)
230
- ) return null;
231
-
232
- let snapshot;
233
- try {
234
- if (!fs.lstatSync(snapshotPath).isFile()) return null;
235
- snapshot = readSnapshot(snapshotPath);
236
- } catch {
237
- return null;
238
- }
239
- if (!snapshot || snapshot.meta.closed === true) return null;
240
- const closedBody = snapshot.body.replace(
241
- /^(---\r?\n[\s\S]*?)(\r?\n---)/,
242
- '$1\nclosed: true$2',
243
- );
244
- if (closedBody === snapshot.body) {
245
- throw new Error(`Cannot close snapshot without frontmatter: ${snapshot.path}`);
246
- }
247
- fs.writeFileSync(snapshot.path, closedBody, 'utf-8');
248
- return snapshot.path;
249
- }
250
-
251
- /** Return the most recent snapshot across all targets, or null. */
252
- export function readLatestSnapshotAcrossTargets({ cwd = process.cwd() } = {}) {
253
- const snapshots = listSnapshots('.md', cwd).map(readSnapshot);
254
- const identifiedSlugs = new Set(
255
- snapshots
256
- .filter((snapshot) => snapshotTargetIdentity(snapshot))
257
- .map((snapshot) => snapshot.meta.slug),
258
- );
259
- const latestByTarget = new Map();
260
- for (const snapshot of snapshots) {
261
- if (!snapshot?.meta.slug) continue;
262
- // Slugs are lossy: distinct targets such as foo/bar and foo-bar can share
263
- // one. Keep each known identity's latest open/closed state independent so
264
- // closing one target cannot hide another target's live backlog. Once a
265
- // slug has any identity-aware snapshot, its older legacy records are no
266
- // longer independently routable and must not resurface as zombie work.
267
- const targetIdentity = snapshotTargetIdentity(snapshot);
268
- if (!targetIdentity && identifiedSlugs.has(snapshot.meta.slug)) continue;
269
- const streamKey = targetIdentity || `slug:${snapshot.meta.slug}`;
270
- latestByTarget.set(streamKey, snapshot);
271
- }
272
- return [...latestByTarget.values()]
273
- .filter((snapshot) => snapshot.meta.closed !== true)
274
- .sort((a, b) => a.path.localeCompare(b.path))
275
- .at(-1) || null;
276
- }
277
-
278
- /**
279
- * Return the last `limit` snapshots' frontmatter, oldest → newest.
280
- * Critique appends a one-line trend to its output using this.
281
- */
282
- export function readTrend(slug, { limit = 5, cwd = process.cwd() } = {}) {
283
- const all = listSnapshots(`__${slug}.md`, cwd);
284
- const slice = all.slice(-limit);
285
- return slice.map((file) => parseFrontmatter(fs.readFileSync(file, 'utf-8')));
286
- }
287
-
288
- // ---- CLI ---------------------------------------------------------------
289
-
290
- // Accept either a ready slug or a concrete target (path/URL) everywhere, so
291
- // callers never have to run the slug step separately. Anything containing a
292
- // path or URL marker is resolved through slugFromTarget.
293
- function isReadySlug(value) {
294
- return /^[a-z0-9-]+$/.test(value || '') && !value.includes('/');
295
- }
296
-
297
- function coerceSlug(value) {
298
- if (!value) return null;
299
- if (isReadySlug(value)) return value;
300
- return slugFromTarget(value);
301
- }
302
-
303
- function main(argv) {
304
- const [cmd, ...args] = argv;
305
- switch (cmd) {
306
- case 'slug': {
307
- const slug = slugFromTarget(args[0]);
308
- if (!slug) { process.stderr.write('no stable slug for input\n'); process.exit(1); }
309
- process.stdout.write(`${slug}\n`);
310
- return;
311
- }
312
- case 'write': {
313
- const [slugArg, bodyFile] = args;
314
- const slug = coerceSlug(slugArg);
315
- if (!slug || !bodyFile) { process.stderr.write('usage: write <slug-or-target> <body-file>\n'); process.exit(1); }
316
- const raw = fs.readFileSync(bodyFile, 'utf-8');
317
- // The body file may be a full report. The caller passes the meta as
318
- // a JSON object on stdin if it wants structured frontmatter; otherwise
319
- // we write with minimal metadata.
320
- let meta = {};
321
- const metaArg = process.env.IMPECCABLE_CRITIQUE_META;
322
- if (metaArg) {
323
- try { meta = JSON.parse(metaArg); } catch { /* ignore */ }
324
- }
325
- // The helper, not caller-provided metadata, owns the target fingerprint.
326
- // This makes the snapshot describe the exact file bytes critique saw.
327
- delete meta.target_fingerprint;
328
- delete meta.target_path;
329
- delete meta.target_identity;
330
- const targetIdentity = resolveTargetIdentity(slugArg);
331
- if (targetIdentity) meta.target_identity = targetIdentity;
332
- const targetFingerprint = fingerprintTarget(slugArg);
333
- if (targetFingerprint) {
334
- meta.target_fingerprint = targetFingerprint;
335
- meta.target_path = resolveLocalTargetPath(slugArg);
336
- }
337
- const out = writeSnapshot({ slug, meta, body: raw });
338
- process.stdout.write(`${out}\n`);
339
- return;
340
- }
341
- case 'latest': {
342
- const target = args[0];
343
- const format = args[1];
344
- const slug = coerceSlug(target);
345
- if (!slug || (format && format !== '--json')) {
346
- process.stderr.write('usage: latest <slug-or-target> [--json]\n');
347
- process.exit(1);
348
- }
349
- const targetFingerprint = fingerprintTarget(target);
350
- const targetPath = resolveLocalTargetPath(target);
351
- const targetIdentity = resolveTargetIdentity(target);
352
- const readySlug = isReadySlug(target);
353
- const newestForSlug = readNewestSnapshot(slug);
354
- if (!newestForSlug) { process.exit(2); }
355
-
356
- // Concrete targets select the newest snapshot for their exact identity,
357
- // not merely the newest filename for a lossy slug. This keeps distinct
358
- // targets such as foo/bar and foo-bar from hiding each other's backlog.
359
- const exactSnapshot = readNewestSnapshotForIdentity(slug, targetIdentity);
360
- let latest = exactSnapshot;
361
- if (!latest && !readySlug) {
362
- // Legacy snapshots have no identity. Preserve their old explicit
363
- // path/URL behavior only when no known target identity was selected.
364
- latest = readNewestSnapshotForIdentity(slug, null);
365
- }
366
- if (!latest) latest = newestForSlug;
367
- if (latest.meta.closed === true) { process.exit(2); }
368
-
369
- const recordedTargetPath = latest.meta.target_path;
370
- const recordedTargetIdentity = snapshotTargetIdentity(latest);
371
- const matchingIdentity = recordedTargetIdentity === targetIdentity;
372
-
373
- // Bare slugs remain a supported lookup mode, including for URL
374
- // snapshots. But when a same-named local file exists, the request is
375
- // ambiguous unless that exact file owns the snapshot identity.
376
- if (readySlug && !recordedTargetIdentity) {
377
- process.stderr.write(
378
- 'ambiguous legacy snapshot target; use an explicit ./path or full URL\n',
379
- );
380
- process.exit(2);
381
- }
382
- if (readySlug && targetPath && fs.existsSync(targetPath) && !matchingIdentity) {
383
- process.stderr.write(
384
- 'ambiguous snapshot slug; use an explicit ./path or remove the local name collision\n',
385
- );
386
- process.exit(2);
387
- }
388
-
389
- const concreteTarget = !readySlug || matchingIdentity;
390
- if (concreteTarget && recordedTargetIdentity && !matchingIdentity) {
391
- process.exit(2);
392
- }
393
- const concreteLocalTarget = concreteTarget && targetPath;
394
- if (concreteLocalTarget && latest.meta.target_fingerprint !== targetFingerprint) {
395
- closeSnapshot(latest.path);
396
- process.exit(2);
397
- }
398
- if (format === '--json') {
399
- process.stdout.write(JSON.stringify({
400
- snapshot_file: path.basename(latest.path),
401
- body: latest.body,
402
- }, null, 2) + '\n');
403
- } else {
404
- process.stdout.write(latest.body);
405
- }
406
- return;
407
- }
408
- case 'close': {
409
- const [slugArg, snapshotFile, ...extra] = args;
410
- const slug = coerceSlug(slugArg);
411
- if (!slug || !snapshotFile || extra.length > 0) {
412
- process.stderr.write('usage: close <resolved-target> <snapshot-file>\n');
413
- process.exit(1);
414
- }
415
- if (
416
- path.basename(snapshotFile) !== snapshotFile
417
- || !SNAPSHOT_FILENAME.test(snapshotFile)
418
- || !snapshotFile.endsWith(`__${slug}.md`)
419
- ) process.exit(2);
420
-
421
- // A slug and filename are not enough to prove ownership because two
422
- // distinct targets can normalize to the same slug. Modern snapshots
423
- // carry a canonical identity, so require the supplied resolved target
424
- // to match it before allowing the exact snapshot to be closed. Legacy
425
- // snapshots without identity retain their historical close behavior.
426
- const snapshotPath = path.join(getCritiqueDir(process.cwd()), snapshotFile);
427
- let snapshot;
428
- try {
429
- if (!fs.lstatSync(snapshotPath).isFile()) process.exit(2);
430
- snapshot = readSnapshot(snapshotPath);
431
- } catch {
432
- process.exit(2);
433
- }
434
- const recordedTargetIdentity = snapshotTargetIdentity(snapshot);
435
- if (
436
- recordedTargetIdentity
437
- && recordedTargetIdentity !== resolveTargetIdentity(slugArg)
438
- ) process.exit(2);
439
-
440
- const closed = closeSnapshot(snapshotFile);
441
- if (!closed) { process.exit(2); }
442
- process.stdout.write(`${closed}\n`);
443
- return;
444
- }
445
- case 'trend': {
446
- const rows = readTrend(coerceSlug(args[0]), { limit: args[1] ? Number(args[1]) : 5 });
447
- process.stdout.write(JSON.stringify(rows, null, 2) + '\n');
448
- return;
449
- }
450
- default:
451
- process.stderr.write('usage: critique-storage.mjs <slug|write|latest|trend|close> [args]\n');
452
- process.exit(1);
453
- }
454
- }
455
-
456
- function isMainModule() {
457
- if (!process.argv[1]) return false;
458
- try {
459
- return fs.realpathSync(fileURLToPath(import.meta.url)) === fs.realpathSync(process.argv[1]);
460
- } catch {
461
- // pathToFileURL normalizes Windows paths; keep it as a fallback for any
462
- // environment where realpath is unavailable.
463
- return import.meta.url === pathToFileURL(process.argv[1]).href;
464
- }
465
- }
466
-
467
- // Why the realpath check: generated skills are often reached through symlinked
468
- // harness directories (for example a demo repo's `.agents` -> source `.agents`).
469
- // Node resolves import.meta.url to the real file, while process.argv[1] keeps
470
- // the symlink path. Comparing canonical paths prevents a silent exit-0 no-op.
471
- if (isMainModule()) {
472
- main(process.argv.slice(2));
473
- }
@@ -1,121 +0,0 @@
1
- [
2
- {
3
- "family": "Betania Patmos GDL",
4
- "weight": 400,
5
- "category": "handwriting",
6
- "variable": false,
7
- "reason": "not loaded or no lettering"
8
- },
9
- {
10
- "family": "Betania Patmos In GDL",
11
- "weight": 400,
12
- "category": "handwriting",
13
- "variable": false,
14
- "reason": "not loaded or no lettering"
15
- },
16
- {
17
- "family": "Doto",
18
- "weight": 300,
19
- "category": "sans",
20
- "variable": true,
21
- "reason": "not loaded or no lettering"
22
- },
23
- {
24
- "family": "Doto",
25
- "weight": 700,
26
- "category": "sans",
27
- "variable": true,
28
- "reason": "not loaded or no lettering"
29
- },
30
- {
31
- "family": "Jacquard 12 Charted",
32
- "weight": 400,
33
- "category": "display",
34
- "variable": false,
35
- "reason": "not loaded or no lettering"
36
- },
37
- {
38
- "family": "Jacquard 24 Charted",
39
- "weight": 400,
40
- "category": "display",
41
- "variable": false,
42
- "reason": "not loaded or no lettering"
43
- },
44
- {
45
- "family": "Jacquarda Bastarda 9 Charted",
46
- "weight": 400,
47
- "category": "display",
48
- "variable": false,
49
- "reason": "not loaded or no lettering"
50
- },
51
- {
52
- "family": "Jersey 10 Charted",
53
- "weight": 400,
54
- "category": "display",
55
- "variable": false,
56
- "reason": "not loaded or no lettering"
57
- },
58
- {
59
- "family": "Jersey 15 Charted",
60
- "weight": 400,
61
- "category": "display",
62
- "variable": false,
63
- "reason": "not loaded or no lettering"
64
- },
65
- {
66
- "family": "Jersey 20 Charted",
67
- "weight": 400,
68
- "category": "display",
69
- "variable": false,
70
- "reason": "not loaded or no lettering"
71
- },
72
- {
73
- "family": "Jersey 25 Charted",
74
- "weight": 400,
75
- "category": "display",
76
- "variable": false,
77
- "reason": "not loaded or no lettering"
78
- },
79
- {
80
- "family": "Micro 5 Charted",
81
- "weight": 400,
82
- "category": "display",
83
- "variable": false,
84
- "reason": "not loaded or no lettering"
85
- },
86
- {
87
- "family": "Montserrat Underline",
88
- "weight": 400,
89
- "category": "sans",
90
- "variable": true,
91
- "reason": "not loaded or no lettering"
92
- },
93
- {
94
- "family": "Montserrat Underline",
95
- "weight": 700,
96
- "category": "sans",
97
- "variable": true,
98
- "reason": "not loaded or no lettering"
99
- },
100
- {
101
- "family": "Redacted",
102
- "weight": 400,
103
- "category": "display",
104
- "variable": false,
105
- "reason": "not loaded or no lettering"
106
- },
107
- {
108
- "family": "Yarndings 12 Charted",
109
- "weight": 400,
110
- "category": "display",
111
- "variable": false,
112
- "reason": "not loaded or no lettering"
113
- },
114
- {
115
- "family": "Yarndings 20 Charted",
116
- "weight": 400,
117
- "category": "display",
118
- "variable": false,
119
- "reason": "not loaded or no lettering"
120
- }
121
- ]