quiver-cli 0.8.0 → 1.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 (200) hide show
  1. package/README.md +110 -45
  2. package/bin/quiver-cli.mjs +3 -1
  3. package/dist/cli.js +546 -458
  4. package/package.json +2 -2
  5. package/template/.agents/AGENTS.md +4 -3
  6. package/template/.agents/config.json +7 -0
  7. package/template/.agents/plugins/opencode/rtk.ts +34 -0
  8. package/template/.agents/skills/agent-browser/SKILL.md +1 -0
  9. package/template/.agents/skills/apps/skybridge/SKILL.md +4 -0
  10. package/template/.agents/skills/design/impeccable/SKILL.md +36 -118
  11. package/template/.agents/skills/design/impeccable/reference/adapt.md +1 -0
  12. package/template/.agents/skills/design/impeccable/reference/adapt.native.md +58 -0
  13. package/template/.agents/skills/design/impeccable/reference/android.md +40 -0
  14. package/template/.agents/skills/design/impeccable/reference/animate.md +73 -188
  15. package/template/.agents/skills/design/impeccable/reference/audit.md +12 -9
  16. package/template/.agents/skills/design/impeccable/reference/audit.native.md +139 -0
  17. package/template/.agents/skills/design/impeccable/reference/bolder.md +19 -101
  18. package/template/.agents/skills/design/impeccable/reference/clarify.md +59 -253
  19. package/template/.agents/skills/design/impeccable/reference/colorize.md +51 -222
  20. package/template/.agents/skills/design/impeccable/reference/craft-floor.md +42 -0
  21. package/template/.agents/skills/design/impeccable/reference/craft.md +3 -121
  22. package/template/.agents/skills/design/impeccable/reference/critique.md +44 -23
  23. package/template/.agents/skills/design/impeccable/reference/degraded/asset-producer.md +90 -0
  24. package/template/.agents/skills/design/impeccable/reference/degraded/documenter.md +24 -0
  25. package/template/.agents/skills/design/impeccable/reference/degraded/finish-reviewer.md +37 -0
  26. package/template/.agents/skills/design/impeccable/reference/degraded/manual-edit-applier.md +92 -0
  27. package/template/.agents/skills/design/impeccable/reference/delight.md +47 -279
  28. package/template/.agents/skills/design/impeccable/reference/distill.md +2 -2
  29. package/template/.agents/skills/design/impeccable/reference/doctor.md +53 -0
  30. package/template/.agents/skills/design/impeccable/reference/document.md +60 -73
  31. package/template/.agents/skills/design/impeccable/reference/harden.md +1 -12
  32. package/template/.agents/skills/design/impeccable/reference/hooks.md +20 -5
  33. package/template/.agents/skills/design/impeccable/reference/init.md +72 -119
  34. package/template/.agents/skills/design/impeccable/reference/ios.md +45 -0
  35. package/template/.agents/skills/design/impeccable/reference/layout.md +54 -131
  36. package/template/.agents/skills/design/impeccable/reference/live-setup.md +102 -0
  37. package/template/.agents/skills/design/impeccable/reference/live.md +116 -511
  38. package/template/.agents/skills/design/impeccable/reference/new-work.md +105 -0
  39. package/template/.agents/skills/design/impeccable/reference/{product.md → operate.md} +6 -5
  40. package/template/.agents/skills/design/impeccable/reference/optimize.md +4 -4
  41. package/template/.agents/skills/design/impeccable/reference/overdrive.md +1 -4
  42. package/template/.agents/skills/design/impeccable/reference/polish.md +68 -212
  43. package/template/.agents/skills/design/impeccable/reference/quieter.md +3 -3
  44. package/template/.agents/skills/design/impeccable/reference/routing.md +18 -0
  45. package/template/.agents/skills/design/impeccable/reference/shape.md +38 -144
  46. package/template/.agents/skills/design/impeccable/reference/typeset.md +51 -250
  47. package/template/.agents/skills/design/impeccable/reference/visualize.md +47 -0
  48. package/template/.agents/skills/design/impeccable/scripts/command-metadata.json +1 -1
  49. package/template/.agents/skills/design/impeccable/scripts/concept-seed.mjs +558 -0
  50. package/template/.agents/skills/design/impeccable/scripts/context-signals.mjs +119 -10
  51. package/template/.agents/skills/design/impeccable/scripts/context.mjs +534 -45
  52. package/template/.agents/skills/design/impeccable/scripts/critique-storage.mjs +18 -47
  53. package/template/.agents/skills/design/impeccable/scripts/detector/browser/injected/index.mjs +96 -10
  54. package/template/.agents/skills/design/impeccable/scripts/detector/cli/main.mjs +174 -26
  55. package/template/.agents/skills/design/impeccable/scripts/detector/design-system.mjs +233 -0
  56. package/template/.agents/skills/design/impeccable/scripts/detector/detect-antipatterns-browser.js +3348 -203
  57. package/template/.agents/skills/design/impeccable/scripts/detector/engines/browser/detect-url.mjs +102 -7
  58. package/template/.agents/skills/design/impeccable/scripts/detector/engines/regex/detect-text.mjs +297 -97
  59. package/template/.agents/skills/design/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +187 -16
  60. package/template/.agents/skills/design/impeccable/scripts/detector/engines/static-html/detect-html.mjs +41 -11
  61. package/template/.agents/skills/design/impeccable/scripts/detector/findings.mjs +7 -1
  62. package/template/.agents/skills/design/impeccable/scripts/detector/node/file-system.mjs +16 -2
  63. package/template/.agents/skills/design/impeccable/scripts/detector/registry/antipatterns.mjs +207 -38
  64. package/template/.agents/skills/design/impeccable/scripts/detector/rules/checks.mjs +3082 -173
  65. package/template/.agents/skills/design/impeccable/scripts/detector/shared/constants.mjs +11 -0
  66. package/template/.agents/skills/design/impeccable/scripts/detector/shared/fonts.mjs +30 -0
  67. package/template/.agents/skills/design/impeccable/scripts/doctor.mjs +336 -0
  68. package/template/.agents/skills/design/impeccable/scripts/embed-prompt.mjs +133 -0
  69. package/template/.agents/skills/design/impeccable/scripts/generate-image.mjs +240 -0
  70. package/template/.agents/skills/design/impeccable/scripts/hook-admin.mjs +98 -18
  71. package/template/.agents/skills/design/impeccable/scripts/hook-before-edit.mjs +46 -6
  72. package/template/.agents/skills/design/impeccable/scripts/hook-lib.mjs +518 -50
  73. package/template/.agents/skills/design/impeccable/scripts/hook.mjs +25 -8
  74. package/template/.agents/skills/design/impeccable/scripts/lib/artifact-schema.mjs +93 -0
  75. package/template/.agents/skills/design/impeccable/scripts/lib/composition-catalog.mjs +200 -0
  76. package/template/.agents/skills/design/impeccable/scripts/lib/concept-catalog.mjs +357 -0
  77. package/template/.agents/skills/design/impeccable/scripts/lib/impeccable-config.mjs +27 -7
  78. package/template/.agents/skills/design/impeccable/scripts/lib/impeccable-paths.mjs +17 -8
  79. package/template/.agents/skills/design/impeccable/scripts/lib/provider.mjs +5 -0
  80. package/template/.agents/skills/design/impeccable/scripts/lib/roll-selection.mjs +362 -0
  81. package/template/.agents/skills/design/impeccable/scripts/lib/staleness-deep.mjs +457 -0
  82. package/template/.agents/skills/design/impeccable/scripts/lib/staleness-notice.mjs +169 -0
  83. package/template/.agents/skills/design/impeccable/scripts/lib/staleness.mjs +457 -0
  84. package/template/.agents/skills/design/impeccable/scripts/lib/surface-briefs.mjs +151 -0
  85. package/template/.agents/skills/design/impeccable/scripts/lib/target-slug.mjs +33 -0
  86. package/template/.agents/skills/design/impeccable/scripts/lib/template-extensions.mjs +146 -0
  87. package/template/.agents/skills/design/impeccable/scripts/live/accept-css.mjs +617 -0
  88. package/template/.agents/skills/design/impeccable/scripts/live/accept-verify.mjs +60 -0
  89. package/template/.agents/skills/design/impeccable/scripts/live/browser-script-parts.mjs +7 -1
  90. package/template/.agents/skills/design/impeccable/scripts/live/completion.mjs +10 -1
  91. package/template/.agents/skills/design/impeccable/scripts/live/event-validation.mjs +67 -5
  92. package/template/.agents/skills/design/impeccable/scripts/live/frameworks/astro.mjs +47 -0
  93. package/template/.agents/skills/design/impeccable/scripts/live/frameworks/detect-utils.mjs +73 -0
  94. package/template/.agents/skills/design/impeccable/scripts/live/frameworks/index.mjs +143 -0
  95. package/template/.agents/skills/design/impeccable/scripts/live/frameworks/journal.mjs +197 -0
  96. package/template/.agents/skills/design/impeccable/scripts/live/frameworks/nextjs.mjs +49 -0
  97. package/template/.agents/skills/design/impeccable/scripts/live/frameworks/nuxt.mjs +161 -0
  98. package/template/.agents/skills/design/impeccable/scripts/live/frameworks/script-src.mjs +17 -0
  99. package/template/.agents/skills/design/impeccable/scripts/live/frameworks/static-html.mjs +26 -0
  100. package/template/.agents/skills/design/impeccable/scripts/live/frameworks/sveltekit.mjs +71 -0
  101. package/template/.agents/skills/design/impeccable/scripts/live/frameworks/tag-strategy.mjs +247 -0
  102. package/template/.agents/skills/design/impeccable/scripts/live/frameworks/tanstack-start.mjs +70 -0
  103. package/template/.agents/skills/design/impeccable/scripts/live/frameworks/vite-generic.mjs +42 -0
  104. package/template/.agents/skills/design/impeccable/scripts/live/generation-preflight.mjs +149 -0
  105. package/template/.agents/skills/design/impeccable/scripts/live/instructions.mjs +142 -0
  106. package/template/.agents/skills/design/impeccable/scripts/live/poll-lanes.mjs +14 -0
  107. package/template/.agents/skills/design/impeccable/scripts/live/roots.mjs +508 -0
  108. package/template/.agents/skills/design/impeccable/scripts/live/session-store.mjs +324 -50
  109. package/template/.agents/skills/design/impeccable/scripts/live/source-lock.mjs +105 -0
  110. package/template/.agents/skills/design/impeccable/scripts/live/source-search.mjs +105 -0
  111. package/template/.agents/skills/design/impeccable/scripts/live/svelte-ast.mjs +961 -0
  112. package/template/.agents/skills/design/impeccable/scripts/live/svelte-component.mjs +588 -72
  113. package/template/.agents/skills/design/impeccable/scripts/live/sveltekit-adapter.mjs +59 -17
  114. package/template/.agents/skills/design/impeccable/scripts/live/tanstack-adapter.mjs +280 -0
  115. package/template/.agents/skills/design/impeccable/scripts/live/vocabulary.mjs +135 -0
  116. package/template/.agents/skills/design/impeccable/scripts/live-accept.mjs +210 -68
  117. package/template/.agents/skills/design/impeccable/scripts/live-browser.js +1562 -223
  118. package/template/.agents/skills/design/impeccable/scripts/live-commit-manual-edits.mjs +3 -0
  119. package/template/.agents/skills/design/impeccable/scripts/live-complete.mjs +33 -1
  120. package/template/.agents/skills/design/impeccable/scripts/live-inject.mjs +175 -255
  121. package/template/.agents/skills/design/impeccable/scripts/live-insert.mjs +26 -6
  122. package/template/.agents/skills/design/impeccable/scripts/live-manual-edit-evidence.mjs +6 -1
  123. package/template/.agents/skills/design/impeccable/scripts/live-poll.mjs +61 -16
  124. package/template/.agents/skills/design/impeccable/scripts/live-resume.mjs +39 -10
  125. package/template/.agents/skills/design/impeccable/scripts/live-server.mjs +573 -47
  126. package/template/.agents/skills/design/impeccable/scripts/live-status.mjs +17 -7
  127. package/template/.agents/skills/design/impeccable/scripts/live-wrap.mjs +124 -91
  128. package/template/.agents/skills/design/impeccable/scripts/live.mjs +88 -26
  129. package/template/.agents/skills/design/impeccable/scripts/palette.mjs +76 -81
  130. package/template/.agents/skills/design/impeccable/scripts/pin.mjs +18 -11
  131. package/template/.agents/skills/design/impeccable/scripts/serve-question.mjs +932 -0
  132. package/template/.agents/skills/design/impeccable/scripts/surface-brief.mjs +74 -0
  133. package/template/.agents/skills/design/shadcn/SKILL.md +46 -11
  134. package/template/.agents/skills/design/shadcn/cli.md +49 -16
  135. package/template/.agents/skills/design/shadcn/customization.md +14 -7
  136. package/template/.agents/skills/design/shadcn/evals/evals.json +30 -0
  137. package/template/.agents/skills/design/shadcn/mcp.md +27 -16
  138. package/template/.agents/skills/design/shadcn/registry.md +277 -0
  139. package/template/.agents/skills/design/shadcn/rules/chat.md +224 -0
  140. package/template/.agents/skills/design/shadcn/rules/composition.md +20 -2
  141. package/template/.agents/skills/design/shadcn/rules/styling.md +23 -0
  142. package/template/.agents/skills/find-skills/SKILL.md +2 -3
  143. package/template/.agents/skills/hono/SKILL.md +579 -0
  144. package/template/.agents/skills/integrations/langfuse/SKILL.md +10 -6
  145. package/template/.agents/skills/integrations/langfuse/references/ci-cd.md +41 -0
  146. package/template/.agents/skills/integrations/langfuse/references/cli.md +8 -0
  147. package/template/.agents/skills/integrations/langfuse/references/error-analysis.md +15 -27
  148. package/template/.agents/skills/integrations/langfuse/references/instrumentation.md +39 -52
  149. package/template/.agents/skills/integrations/langfuse/references/judge-calibration.md +5 -2
  150. package/template/.agents/skills/integrations/langfuse/references/prompt-engineering.md +35 -0
  151. package/template/.agents/skills/integrations/langfuse/references/prompt-migration.md +41 -196
  152. package/template/.agents/skills/integrations/langfuse/references/skill-feedback.md +3 -0
  153. package/template/.agents/skills/integrations/langfuse/references/trace-evaluator-upgrade.md +76 -0
  154. package/template/.agents/skills/integrations/langfuse/references/user-feedback.md +4 -0
  155. package/template/.agents/skills/integrations/langfuse/references/v4-project-migration.md +73 -0
  156. package/template/.agents/skills/supabase/CHANGELOG.md +71 -0
  157. package/template/.agents/skills/supabase/SKILL.md +145 -0
  158. package/template/.agents/skills/supabase/assets/feedback-issue-template.md +17 -0
  159. package/template/.agents/skills/supabase/references/skill-feedback.md +17 -0
  160. package/template/.agents/skills/supabase-postgres-best-practices/CHANGELOG.md +73 -0
  161. package/template/.agents/skills/supabase-postgres-best-practices/SKILL.md +64 -0
  162. package/template/.agents/skills/supabase-postgres-best-practices/references/_contributing.md +170 -0
  163. package/template/.agents/skills/supabase-postgres-best-practices/references/_sections.md +39 -0
  164. package/template/.agents/skills/supabase-postgres-best-practices/references/_template.md +34 -0
  165. package/template/.agents/skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -0
  166. package/template/.agents/skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -0
  167. package/template/.agents/skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -0
  168. package/template/.agents/skills/supabase-postgres-best-practices/references/conn-limits.md +44 -0
  169. package/template/.agents/skills/supabase-postgres-best-practices/references/conn-pooling.md +41 -0
  170. package/template/.agents/skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -0
  171. package/template/.agents/skills/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -0
  172. package/template/.agents/skills/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -0
  173. package/template/.agents/skills/supabase-postgres-best-practices/references/data-pagination.md +50 -0
  174. package/template/.agents/skills/supabase-postgres-best-practices/references/data-upsert.md +50 -0
  175. package/template/.agents/skills/supabase-postgres-best-practices/references/lock-advisory.md +56 -0
  176. package/template/.agents/skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -0
  177. package/template/.agents/skills/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -0
  178. package/template/.agents/skills/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -0
  179. package/template/.agents/skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -0
  180. package/template/.agents/skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -0
  181. package/template/.agents/skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -0
  182. package/template/.agents/skills/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -0
  183. package/template/.agents/skills/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -0
  184. package/template/.agents/skills/supabase-postgres-best-practices/references/query-index-types.md +48 -0
  185. package/template/.agents/skills/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -0
  186. package/template/.agents/skills/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -0
  187. package/template/.agents/skills/supabase-postgres-best-practices/references/schema-constraints.md +80 -0
  188. package/template/.agents/skills/supabase-postgres-best-practices/references/schema-data-types.md +46 -0
  189. package/template/.agents/skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -0
  190. package/template/.agents/skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -0
  191. package/template/.agents/skills/supabase-postgres-best-practices/references/schema-partitioning.md +55 -0
  192. package/template/.agents/skills/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -0
  193. package/template/.agents/skills/supabase-postgres-best-practices/references/security-privileges.md +54 -0
  194. package/template/.agents/skills/supabase-postgres-best-practices/references/security-rls-basics.md +50 -0
  195. package/template/.agents/skills/supabase-postgres-best-practices/references/security-rls-performance.md +63 -0
  196. package/template/.agents/upstreams.json +34 -12
  197. package/template/.agents/skills/design/impeccable/reference/brand.md +0 -108
  198. package/template/.agents/skills/design/impeccable/reference/codex.md +0 -105
  199. package/template/.agents/skills/design/impeccable/reference/interaction-design.md +0 -189
  200. package/template/.agents/skills/integrations/langfuse/references/sdk-upgrade.md +0 -175
@@ -0,0 +1,277 @@
1
+ # Registry Authoring and Addresses
2
+
3
+ Use this reference when the user wants to create, fix, publish, or reason about
4
+ a shadcn registry.
5
+
6
+ ## Mental Model
7
+
8
+ A registry has two forms:
9
+
10
+ - **Source registry**: an authored `registry.json` in a project or repository.
11
+ It may use `include` and file paths that point at source files.
12
+ - **Built registry**: generated JSON files served to CLI consumers, usually
13
+ from `public/r`. Use `npx shadcn@latest build` to create this form.
14
+
15
+ The CLI installer consumes registry item payloads. A source registry is a way to
16
+ author those payloads from real files.
17
+
18
+ Registry items are not limited to React components. They can distribute
19
+ components, hooks, utilities, design tokens, pages, config files, docs, rules,
20
+ workflows, templates, MCP files, and other project files.
21
+
22
+ ## Root `registry.json`
23
+
24
+ The root registry file should define registry metadata and either `items` or
25
+ `include`.
26
+
27
+ ```json
28
+ {
29
+ "$schema": "https://ui.shadcn.com/schema/registry.json",
30
+ "name": "acme",
31
+ "homepage": "https://acme.com",
32
+ "items": [
33
+ {
34
+ "name": "absolute-url",
35
+ "type": "registry:lib",
36
+ "title": "Absolute URL",
37
+ "description": "A utility to turn any path into an absolute URL.",
38
+ "files": [
39
+ {
40
+ "path": "lib/absolute-url.ts",
41
+ "type": "registry:lib"
42
+ }
43
+ ]
44
+ }
45
+ ]
46
+ }
47
+ ```
48
+
49
+ Root registry rules:
50
+
51
+ - Root `registry.json` must include `name` and `homepage`.
52
+ - `items` is an array of registry item definitions.
53
+ - `include` may be used to split the source registry into multiple files.
54
+ - Included registry files may omit `name` and `homepage`.
55
+
56
+ ## Include
57
+
58
+ Use `include` to keep large registries modular.
59
+
60
+ ```json
61
+ {
62
+ "$schema": "https://ui.shadcn.com/schema/registry.json",
63
+ "name": "acme",
64
+ "homepage": "https://acme.com",
65
+ "include": ["registry/ui/registry.json", "registry/blocks/registry.json"]
66
+ }
67
+ ```
68
+
69
+ Include rules:
70
+
71
+ - Include paths are relative to the `registry.json` that declares them.
72
+ - Include paths must explicitly point to a `registry.json` file.
73
+ - Do not use remote URLs, absolute paths, or parent traversal (`..`).
74
+ - Item file paths are relative to the registry file that declares the item.
75
+ - Duplicate item names fail across the resolved registry.
76
+
77
+ Example included file:
78
+
79
+ ```json
80
+ {
81
+ "items": [
82
+ {
83
+ "name": "button",
84
+ "type": "registry:ui",
85
+ "files": [
86
+ {
87
+ "path": "button.tsx",
88
+ "type": "registry:ui"
89
+ }
90
+ ]
91
+ }
92
+ ]
93
+ }
94
+ ```
95
+
96
+ If this file is at `registry/ui/registry.json`, then `button.tsx` is read from
97
+ `registry/ui/button.tsx`, and the built item path is emitted relative to the
98
+ root registry.
99
+
100
+ ## Item Definitions
101
+
102
+ Common item fields:
103
+
104
+ ```json
105
+ {
106
+ "name": "login-form",
107
+ "type": "registry:block",
108
+ "title": "Login Form",
109
+ "description": "A login form with email and password fields.",
110
+ "dependencies": ["zod"],
111
+ "registryDependencies": ["button", "input", "label"],
112
+ "files": [
113
+ {
114
+ "path": "blocks/login-form.tsx",
115
+ "type": "registry:block"
116
+ }
117
+ ],
118
+ "cssVars": {
119
+ "light": {
120
+ "brand": "oklch(0.62 0.18 250)"
121
+ },
122
+ "dark": {
123
+ "brand": "oklch(0.72 0.16 250)"
124
+ }
125
+ }
126
+ }
127
+ ```
128
+
129
+ Important fields:
130
+
131
+ - `name`: the installable item name. It is not necessarily a file path.
132
+ - `type`: one of the registry item types, such as `registry:ui`,
133
+ `registry:block`, `registry:lib`, `registry:hook`, `registry:file`,
134
+ `registry:page`, `registry:theme`, `registry:style`, `registry:font`, or
135
+ `registry:item`.
136
+ - `files`: source files copied or generated by the item.
137
+ - `dependencies`: npm runtime dependencies.
138
+ - `devDependencies`: npm development dependencies.
139
+ - `registryDependencies`: other registry items required by this item.
140
+ - `cssVars`, `css`, `tailwind`, `envVars`, and `docs`: optional install-time
141
+ additions.
142
+
143
+ File rules:
144
+
145
+ - File paths are relative to the declaring `registry.json`.
146
+ - `registry:file` and `registry:page` files require a `target`.
147
+ - Do not use remote file URLs in source registry file paths.
148
+ - Keep source files copy-pasteable: no hidden app-only imports.
149
+
150
+ ## Registry Dependencies
151
+
152
+ `registryDependencies` entries are item addresses, not file paths.
153
+
154
+ ```json
155
+ {
156
+ "name": "login-form",
157
+ "type": "registry:block",
158
+ "registryDependencies": ["button", "@acme/input", "acme/ui/card#v1.2.0"],
159
+ "files": [
160
+ {
161
+ "path": "blocks/login-form.tsx",
162
+ "type": "registry:block"
163
+ }
164
+ ]
165
+ }
166
+ ```
167
+
168
+ Dependency rules:
169
+
170
+ - Bare names such as `"button"` mean official shadcn items.
171
+ - Bare names never mean same-registry or same-repository items.
172
+ - Namespaced dependencies use `@namespace/item-name`.
173
+ - GitHub dependencies use `owner/repo/item-name`.
174
+ - Pin GitHub dependencies with `owner/repo/item-name#ref` when needed.
175
+ - Refs are not inherited. If `owner/repo/foo#v2` depends on `bar` from the same
176
+ repo at `v2`, write `owner/repo/bar#v2`.
177
+ - Do not use relative dependencies such as `"./bar"`.
178
+
179
+ ## Address Schemes
180
+
181
+ When reasoning about a registry item string, classify it first.
182
+
183
+ | Address | Scheme | Meaning |
184
+ | ----------------------------------- | --------- | ------------------------------------------------------------ |
185
+ | `button` | shadcn | Official shadcn item named `button`. |
186
+ | `@acme/button` | namespace | Item `button` from configured registry `@acme`. |
187
+ | `@acme/ui/button` | namespace | Item `ui/button` from configured registry `@acme`. |
188
+ | `https://example.com/r/button.json` | url | Built registry item JSON at that URL. |
189
+ | `./button.json` | file | Built registry item JSON on disk. |
190
+ | `acme/ui/button` | github | Item `button` from GitHub repo `acme/ui`. |
191
+ | `acme/ui/forms/login#main` | github | Item `forms/login` from GitHub repo `acme/ui` at ref `main`. |
192
+
193
+ For namespace and GitHub addresses, slashful item names are allowed and are item
194
+ names, not file paths. Addresses ending in `.json` keep file-address
195
+ precedence, so `acme/ui/data/schema.json` is treated as a file path, not a
196
+ GitHub item address.
197
+
198
+ ## GitHub Registries
199
+
200
+ A public GitHub repository can act as a source registry when it has a root
201
+ `registry.json`.
202
+
203
+ ```txt
204
+ owner/repo/item-name[#ref]
205
+ ```
206
+
207
+ Rules:
208
+
209
+ - The first two path segments are GitHub owner and repo.
210
+ - All remaining path segments are the registry item name.
211
+ - The source entrypoint is always root `registry.json`.
212
+ - GitHub registries are source registries consumed directly by the CLI. They do
213
+ not require `shadcn build` or generated item JSON files.
214
+ - `include` follows the same source-registry rules as local registries.
215
+ - Currently, GitHub addresses support public `github.com` repositories only.
216
+ - Private repos and GitHub Enterprise require explicit product decisions.
217
+
218
+ When implementing GitHub registry fetching, resolve refs to a commit SHA before
219
+ reading source files. Do not read moving refs directly from
220
+ `raw.githubusercontent.com`, because branch-like refs can be cached for several
221
+ minutes.
222
+
223
+ Preferred flow:
224
+
225
+ ```txt
226
+ owner/repo[#ref]
227
+ -> resolve ref with git ls-remote
228
+ -> commit SHA
229
+ -> read https://raw.githubusercontent.com/{owner}/{repo}/{sha}/registry.json
230
+ -> read includes and item files from the same SHA
231
+ ```
232
+
233
+ This keeps a command on one consistent repository snapshot.
234
+
235
+ Full 40-character commit SHAs are already stable and can be used directly.
236
+ Branches, tags, and short refs require Git so the CLI can resolve them to a
237
+ commit SHA first.
238
+
239
+ ## Build and Verify
240
+
241
+ Use the CLI to build source registries:
242
+
243
+ ```bash
244
+ npx shadcn@latest build
245
+ npx shadcn@latest build registry.json --output public/r
246
+ ```
247
+
248
+ Use CLI commands to inspect the result:
249
+
250
+ ```bash
251
+ npx shadcn@latest list @acme
252
+ npx shadcn@latest search @acme -q "login"
253
+ npx shadcn@latest view @acme/login-form
254
+ npx shadcn@latest add @acme/login-form --dry-run
255
+ npx shadcn@latest registry validate ./registry.json
256
+ ```
257
+
258
+ Use GitHub addresses directly for public GitHub registries:
259
+
260
+ ```bash
261
+ npx shadcn@latest list owner/repo
262
+ npx shadcn@latest search owner/repo -q "login"
263
+ npx shadcn@latest view owner/repo/item
264
+ npx shadcn@latest add owner/repo/item --dry-run
265
+ npx shadcn@latest registry validate owner/repo
266
+ ```
267
+
268
+ When working on registry implementation in the shadcn/ui codebase:
269
+
270
+ - Keep address parsing pure and testable.
271
+ - Do not add side effects to validators.
272
+ - Preserve existing behavior for official shadcn, namespace, URL, and file
273
+ schemes.
274
+ - Add tests for address parsing, source loading, dependency resolution, list,
275
+ search, view, and add paths.
276
+ - Prefer small source-reader abstractions over a plugin system until there are
277
+ multiple real providers.
@@ -0,0 +1,224 @@
1
+ # Chat & Messaging
2
+
3
+ Components for conversation and chat UI. Compose these instead of hand-rolling
4
+ bubbles, scroll containers, dividers, or attachment cards.
5
+
6
+ Install: `npx shadcn@latest add message-scroller message bubble attachment marker`
7
+
8
+ The same component names and props ship for both `base` and `radix`; only
9
+ composition differs (`render` vs `asChild`). See [base-vs-radix.md](./base-vs-radix.md).
10
+
11
+ ## Contents
12
+
13
+ - Scrollable threads use MessageScroller
14
+ - Message rows use Message
15
+ - Message surfaces use Bubble
16
+ - Attachments use Attachment
17
+ - System notes and dividers use Marker
18
+ - Streaming, anchoring, and jump-to-latest are built in
19
+ - Escape hatch: the scroller hooks
20
+
21
+ ---
22
+
23
+ ## Scrollable threads use MessageScroller
24
+
25
+ A conversation that scrolls, follows new messages, restores position, or jumps
26
+ to a message uses `MessageScroller`. Don't build a raw overflow container with
27
+ manual scroll wiring, and don't reach for `ScrollArea`.
28
+
29
+ The parts nest in a fixed order. Every direct child of the content is wrapped in
30
+ a `MessageScrollerItem` so the scroller can measure, anchor, preserve position,
31
+ track visibility, and jump to it. `MessageScrollerButton` sits inside
32
+ `MessageScroller`, after the viewport.
33
+
34
+ **Incorrect:**
35
+
36
+ ```tsx
37
+ // Hand-rolled scroll container with manual stick-to-bottom logic.
38
+ <div ref={scrollRef} onScroll={handleScroll} className="flex-1 overflow-y-auto">
39
+ <div className="flex flex-col gap-6 p-4">
40
+ {messages.map((m) => (
41
+ <ChatMessage key={m.id} message={m} />
42
+ ))}
43
+ </div>
44
+ </div>
45
+ ```
46
+
47
+ **Correct:**
48
+
49
+ ```tsx
50
+ <MessageScrollerProvider autoScroll>
51
+ <MessageScroller>
52
+ <MessageScrollerViewport>
53
+ <MessageScrollerContent>
54
+ {messages.map((message) => (
55
+ <MessageScrollerItem
56
+ key={message.id}
57
+ messageId={message.id}
58
+ scrollAnchor={message.role === "user"}
59
+ >
60
+ <Message align={message.role === "user" ? "end" : "start"}>
61
+ {/* ...message content... */}
62
+ </Message>
63
+ </MessageScrollerItem>
64
+ ))}
65
+ </MessageScrollerContent>
66
+ </MessageScrollerViewport>
67
+ <MessageScrollerButton />
68
+ </MessageScroller>
69
+ </MessageScrollerProvider>
70
+ ```
71
+
72
+ ---
73
+
74
+ ## Message rows use Message
75
+
76
+ `Message` lays out a single row: avatar, header, content, footer, with
77
+ alignment. Group consecutive rows from one sender with `MessageGroup`. Don't
78
+ rebuild the row from flex divs.
79
+
80
+ `align="end"` is the current user's side; `align="start"` is everyone else.
81
+
82
+ ```tsx
83
+ <Message align="start">
84
+ <MessageAvatar>
85
+ <Avatar>
86
+ <AvatarImage src={sender.avatar} alt={sender.name} />
87
+ <AvatarFallback>{initials}</AvatarFallback>
88
+ </Avatar>
89
+ </MessageAvatar>
90
+ <MessageContent>
91
+ <MessageHeader>{sender.name}</MessageHeader>
92
+ <Bubble>
93
+ <BubbleContent>{text}</BubbleContent>
94
+ </Bubble>
95
+ <MessageFooter>{time}</MessageFooter>
96
+ </MessageContent>
97
+ </Message>
98
+ ```
99
+
100
+ ---
101
+
102
+ ## Message surfaces use Bubble
103
+
104
+ The colored message surface is `Bubble` + `BubbleContent`, never a styled `div`
105
+ with `bg-muted` / `bg-primary` and hand-managed corners.
106
+
107
+ - `variant`: `default`, `secondary`, `muted`, `tinted`, `outline`, `ghost`, `destructive`.
108
+ - `align`: `start` or `end` (matches the `Message` side).
109
+
110
+ `BubbleReactions` renders the reaction cluster. `side` (`top` | `bottom`) and
111
+ `align` (`start` | `end`) position it against the bubble. Don't lay reactions out
112
+ with absolutely-positioned `Badge`s.
113
+
114
+ **Incorrect:**
115
+
116
+ ```tsx
117
+ <div className="w-fit rounded-2xl bg-primary px-3 py-2 text-primary-foreground">
118
+ {text}
119
+ </div>
120
+ ```
121
+
122
+ **Correct:**
123
+
124
+ ```tsx
125
+ <Bubble variant="default" align="end">
126
+ <BubbleContent>{text}</BubbleContent>
127
+ <BubbleReactions side="bottom" align="end">
128
+ <Badge variant="secondary">👍 2</Badge>
129
+ </BubbleReactions>
130
+ </Bubble>
131
+ ```
132
+
133
+ ---
134
+
135
+ ## Attachments use Attachment
136
+
137
+ File and image attachments use `Attachment`, not `Item` or a custom card. It
138
+ carries upload state, so wire `state` to the real status rather than rendering a
139
+ separate spinner.
140
+
141
+ - `state`: `idle`, `uploading`, `processing`, `error`, `done`. `uploading` and
142
+ `processing` apply the `shimmer` animation to the title automatically.
143
+ - `size`: `default`, `sm`, `xs`. `orientation`: `horizontal`, `vertical`.
144
+ - Use `AttachmentGroup` to lay out several attachments in a scrolling row.
145
+
146
+ ```tsx
147
+ <Attachment state="done">
148
+ <AttachmentMedia variant="icon">
149
+ <FileTextIcon />
150
+ </AttachmentMedia>
151
+ <AttachmentContent>
152
+ <AttachmentTitle>homepage-feedback.pdf</AttachmentTitle>
153
+ <AttachmentDescription>PDF · 2.4 MB</AttachmentDescription>
154
+ </AttachmentContent>
155
+ <AttachmentActions>
156
+ <AttachmentAction>
157
+ <DownloadIcon />
158
+ </AttachmentAction>
159
+ </AttachmentActions>
160
+ </Attachment>
161
+ ```
162
+
163
+ For an image, use `<AttachmentMedia variant="image">` with an `img` child.
164
+
165
+ ---
166
+
167
+ ## System notes and dividers use Marker
168
+
169
+ Status lines ("Sarah joined the conversation"), date dividers ("Today"), and
170
+ labeled separators are `Marker`, not a `Separator` plus a centered span.
171
+
172
+ - `variant`: `default` (plain row), `separator` (centered label with rules on
173
+ each side), `border` (bottom-bordered row).
174
+ - `MarkerIcon` holds a leading icon; `MarkerContent` holds the label.
175
+
176
+ **Incorrect:**
177
+
178
+ ```tsx
179
+ <div className="flex items-center gap-3 py-2">
180
+ <Separator className="flex-1" />
181
+ <span className="text-xs text-muted-foreground">Today</span>
182
+ <Separator className="flex-1" />
183
+ </div>
184
+ ```
185
+
186
+ **Correct:**
187
+
188
+ ```tsx
189
+ <Marker variant="separator">
190
+ <MarkerContent>Today</MarkerContent>
191
+ </Marker>
192
+ ```
193
+
194
+ ---
195
+
196
+ ## Streaming, anchoring, and jump-to-latest are built in
197
+
198
+ `MessageScroller` handles the behavior that chat UIs usually reinvent. Don't
199
+ write a `useStickToBottom` hook, a `ResizeObserver`, or manual `scrollTop` math.
200
+
201
+ - **Follow the live edge while streaming.** `MessageScrollerProvider` with
202
+ `autoScroll` keeps the view pinned to new content and yields the moment the
203
+ user scrolls up. Streaming token updates that grow the last message are
204
+ followed automatically.
205
+ - **Anchor a turn.** `scrollAnchor` on a `MessageScrollerItem` marks the row to
206
+ hold in view (typically the user's message that started the turn).
207
+ - **Jump to latest.** `MessageScrollerButton` appears when the user scrolls away
208
+ and scrolls back on click. `direction="end"` (default) or `direction="start"`.
209
+ It is a self-managing control, so don't gate it behind your own scroll-position
210
+ state.
211
+
212
+ For a "thinking…" indicator while the model generates, apply the `shimmer`
213
+ utility to text. Don't author a custom keyframe animation. See
214
+ [styling.md](./styling.md).
215
+
216
+ ---
217
+
218
+ ## Escape hatch: the scroller hooks
219
+
220
+ For behavior the parts don't expose, read state from the hooks rather than
221
+ re-implementing the scroller: `useMessageScroller`,
222
+ `useMessageScrollerVisibility`, and `useMessageScrollerScrollable`. They come
223
+ from the auto-installed `@shadcn/react` dependency, so there's nothing extra to
224
+ install. Reach for them only when composition can't express what you need.
@@ -5,7 +5,7 @@
5
5
  - Items always inside their Group component
6
6
  - Callouts use Alert
7
7
  - Empty states use Empty component
8
- - Toast notifications use sonner
8
+ - Toast notifications follow the project base
9
9
  - Choosing between overlay components
10
10
  - Dialog, Sheet, and Drawer always need a Title
11
11
  - Card structure
@@ -51,6 +51,12 @@ This applies to all group-based components:
51
51
  | `MenubarItem` | `MenubarGroup` |
52
52
  | `ContextMenuItem` | `ContextMenuGroup` |
53
53
  | `CommandItem` | `CommandGroup` |
54
+ | `MessageScrollerItem` | `MessageScrollerContent` |
55
+ | `Message` (consecutive, same sender) | `MessageGroup` |
56
+ | `Bubble` (stacked) | `BubbleGroup` |
57
+ | `Attachment` (in a row) | `AttachmentGroup` |
58
+
59
+ Chat components nest in a fixed order (`MessageScrollerProvider` → `MessageScroller` → `MessageScrollerViewport` → `MessageScrollerContent` → `MessageScrollerItem`). See [chat.md](./chat.md).
54
60
 
55
61
  ---
56
62
 
@@ -82,7 +88,19 @@ This applies to all group-based components:
82
88
 
83
89
  ---
84
90
 
85
- ## Toast notifications use sonner
91
+ ## Toast notifications follow the project base
92
+
93
+ For Base UI projects, use the `toast` component:
94
+
95
+ ```tsx
96
+ import { toast } from "@/components/ui/toast"
97
+
98
+ toast.add({
99
+ title: "Changes saved.",
100
+ })
101
+ ```
102
+
103
+ For Radix and React Aria projects, use Sonner:
86
104
 
87
105
  ```tsx
88
106
  import { toast } from "sonner"
@@ -13,6 +13,7 @@ See [customization.md](../customization.md) for theming, CSS variables, and addi
13
13
  - No manual dark: color overrides
14
14
  - Use cn() for conditional classes
15
15
  - No manual z-index on overlay components
16
+ - Use shimmer / scroll-fade utilities, not custom animations
16
17
 
17
18
  ---
18
19
 
@@ -160,3 +161,25 @@ import { cn } from "@/lib/utils"
160
161
  ## No manual z-index on overlay components
161
162
 
162
163
  `Dialog`, `Sheet`, `Drawer`, `AlertDialog`, `DropdownMenu`, `Popover`, `Tooltip`, `HoverCard` handle their own stacking. Never add `z-50` or `z-[999]`.
164
+
165
+ ---
166
+
167
+ ## Use shimmer / scroll-fade utilities, not custom animations
168
+
169
+ For a live "thinking…" or loading-text shimmer, apply the `shimmer` utility. Don't author a custom `@keyframes` or a `bg-clip-text` gradient sweep.
170
+
171
+ For scroll-aware edge fading on a scroll container, use `scroll-fade` (and the axis variants `scroll-fade-x` / `scroll-fade-b`). Don't hand-roll mask gradients. The chat components already apply these internally: `Attachment` shimmers its title during upload, and `MessageScrollerViewport` fades its edges.
172
+
173
+ **Incorrect:**
174
+
175
+ ```tsx
176
+ <span className="animate-pulse bg-gradient-to-r from-muted-foreground/40 via-foreground/70 to-muted-foreground/40 bg-clip-text text-transparent [animation:shimmer_1.6s_infinite]">
177
+ Thinking…
178
+ </span>
179
+ ```
180
+
181
+ **Correct:**
182
+
183
+ ```tsx
184
+ <span className="shimmer">Thinking…</span>
185
+ ```
@@ -24,9 +24,8 @@ The Skills CLI (`npx skills`) is the package manager for the open agent skills e
24
24
 
25
25
  **Key commands:**
26
26
 
27
- - `npx skills find [query]` - Search for skills interactively or by keyword
27
+ - `npx skills find [query] [--owner <owner>]` - Search for skills interactively or by keyword, optionally scoped to a GitHub owner
28
28
  - `npx skills add <package>` - Install a skill from GitHub or other sources
29
- - `npx skills check` - Check for skill updates
30
29
  - `npx skills update` - Update all installed skills
31
30
 
32
31
  **Browse skills at:** https://skills.sh/
@@ -54,7 +53,7 @@ For example, top skills for web development include:
54
53
  If the leaderboard doesn't cover the user's need, run the find command:
55
54
 
56
55
  ```bash
57
- npx skills find [query]
56
+ npx skills find [query] [--owner <owner>]
58
57
  ```
59
58
 
60
59
  For example: