@askrjs/cli 0.0.3 → 0.0.4

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 (287) hide show
  1. package/README.md +37 -0
  2. package/dist/add.d.ts +16 -0
  3. package/dist/add.js +33 -29
  4. package/dist/cli.d.ts +5 -0
  5. package/dist/cli.js +0 -2
  6. package/dist/create.d.ts +5 -0
  7. package/dist/create.js +104 -26
  8. package/dist/directory-swap-DWoHtx7C.js +35 -0
  9. package/dist/discovery-Difb7Y4G.js +0 -2
  10. package/dist/generate.d.ts +5 -0
  11. package/dist/generate.js +77 -12
  12. package/dist/is-direct-execution-Cdlr-ZUl.js +0 -2
  13. package/dist/openapi.d.ts +25 -0
  14. package/dist/openapi.js +44 -12
  15. package/dist/planner-VAj7qlxr.js +0 -2
  16. package/dist/range-YUs9eimn.js +0 -2
  17. package/dist/registry-CyrRHRG5.js +0 -2
  18. package/dist/skills/askr-ssr-ssg/SKILL.md +3 -1
  19. package/dist/{skills-Bh0mEhIx.js → skills-B7CbWur9.js} +89 -26
  20. package/dist/skills.d.ts +18 -0
  21. package/dist/skills.js +1 -1
  22. package/dist/specification-DXnDOC-0.js +0 -2
  23. package/dist/ssg-config.d.ts +41 -0
  24. package/dist/ssg-config.js +1 -0
  25. package/dist/ssg.d.ts +61 -0
  26. package/dist/ssg.js +360 -24
  27. package/dist/templates/full-stack/package.json +1 -1
  28. package/dist/templates/full-stack/src/server/action-registry.ts +0 -1
  29. package/dist/templates/full-stack/tsconfig.json +1 -1
  30. package/dist/templates/spa/package.json +2 -3
  31. package/dist/templates/spa/src/pages/app/_routes.tsx +2 -0
  32. package/dist/templates/spa/src/pages/public/_routes.tsx +2 -0
  33. package/dist/templates/spa/tsconfig.json +2 -1
  34. package/dist/templates/spa/vitest.config.ts +0 -4
  35. package/dist/templates/ssg/README.md +1 -1
  36. package/dist/templates/ssg/package.json +1 -1
  37. package/dist/templates/ssg/ssg.config.ts +7 -0
  38. package/dist/templates/ssg/tests/ssg-config.test.ts +2 -0
  39. package/dist/templates/ssg/tsconfig.json +2 -1
  40. package/dist/templates/ssg/vitest.config.ts +0 -4
  41. package/dist/templates/ssr/package.json +2 -2
  42. package/dist/templates/startkit/package.json +2 -2
  43. package/dist/templates/startkit/src/lib/mock-data.ts +17 -39
  44. package/dist/templates/startkit/tsconfig.json +2 -1
  45. package/dist/update.d.ts +41 -0
  46. package/dist/update.js +0 -2
  47. package/dist/writer-D8qe_7ud.js +0 -2
  48. package/package.json +13 -8
  49. package/dist/add.js.map +0 -1
  50. package/dist/cli.js.map +0 -1
  51. package/dist/create.js.map +0 -1
  52. package/dist/discovery-Difb7Y4G.js.map +0 -1
  53. package/dist/generate.js.map +0 -1
  54. package/dist/is-direct-execution-Cdlr-ZUl.js.map +0 -1
  55. package/dist/openapi.js.map +0 -1
  56. package/dist/planner-VAj7qlxr.js.map +0 -1
  57. package/dist/range-YUs9eimn.js.map +0 -1
  58. package/dist/registry-CyrRHRG5.js.map +0 -1
  59. package/dist/skills-Bh0mEhIx.js.map +0 -1
  60. package/dist/specification-DXnDOC-0.js.map +0 -1
  61. package/dist/ssg.js.map +0 -1
  62. package/dist/templates/full-stack/src/vite-server.d.ts +0 -5
  63. package/dist/templates/spa/src/styles.d.ts +0 -1
  64. package/dist/templates/ssg/src/vite-env.d.ts +0 -5
  65. package/dist/templates/ssr/src/vite-server.d.ts +0 -7
  66. package/dist/templates/startkit/src/vite-env.d.ts +0 -5
  67. package/dist/update.js.map +0 -1
  68. package/dist/writer-D8qe_7ud.js.map +0 -1
  69. package/skills/askr-accessibility/SKILL.md +0 -68
  70. package/skills/askr-accessibility/agents/openai.yaml +0 -4
  71. package/skills/askr-agent-execution/SKILL.md +0 -85
  72. package/skills/askr-agent-execution/agents/openai.yaml +0 -4
  73. package/skills/askr-agent-workflows/SKILL.md +0 -57
  74. package/skills/askr-agent-workflows/agents/openai.yaml +0 -4
  75. package/skills/askr-api-integration/SKILL.md +0 -79
  76. package/skills/askr-api-integration/agents/openai.yaml +0 -4
  77. package/skills/askr-app-builder/SKILL.md +0 -99
  78. package/skills/askr-app-builder/agents/openai.yaml +0 -4
  79. package/skills/askr-auth-access/SKILL.md +0 -74
  80. package/skills/askr-auth-access/agents/openai.yaml +0 -4
  81. package/skills/askr-cli-vite/SKILL.md +0 -76
  82. package/skills/askr-cli-vite/agents/openai.yaml +0 -4
  83. package/skills/askr-dashboard-charts/SKILL.md +0 -99
  84. package/skills/askr-dashboard-charts/agents/openai.yaml +0 -4
  85. package/skills/askr-design-system/SKILL.md +0 -86
  86. package/skills/askr-design-system/agents/openai.yaml +0 -4
  87. package/skills/askr-env-config/SKILL.md +0 -74
  88. package/skills/askr-env-config/agents/openai.yaml +0 -4
  89. package/skills/askr-error-loading-empty/SKILL.md +0 -89
  90. package/skills/askr-error-loading-empty/agents/openai.yaml +0 -4
  91. package/skills/askr-file-upload-artifacts/SKILL.md +0 -77
  92. package/skills/askr-file-upload-artifacts/agents/openai.yaml +0 -4
  93. package/skills/askr-forms-tables-crud/SKILL.md +0 -98
  94. package/skills/askr-forms-tables-crud/agents/openai.yaml +0 -4
  95. package/skills/askr-mental-model/SKILL.md +0 -109
  96. package/skills/askr-mental-model/agents/openai.yaml +0 -4
  97. package/skills/askr-migration-react/SKILL.md +0 -81
  98. package/skills/askr-migration-react/agents/openai.yaml +0 -4
  99. package/skills/askr-observability-debugging/SKILL.md +0 -83
  100. package/skills/askr-observability-debugging/agents/openai.yaml +0 -4
  101. package/skills/askr-project-structure/SKILL.md +0 -79
  102. package/skills/askr-project-structure/agents/openai.yaml +0 -4
  103. package/skills/askr-query-mutation/SKILL.md +0 -115
  104. package/skills/askr-query-mutation/agents/openai.yaml +0 -4
  105. package/skills/askr-realtime-streaming/SKILL.md +0 -76
  106. package/skills/askr-realtime-streaming/agents/openai.yaml +0 -4
  107. package/skills/askr-resources-data/SKILL.md +0 -100
  108. package/skills/askr-resources-data/agents/openai.yaml +0 -4
  109. package/skills/askr-routing-layouts/SKILL.md +0 -107
  110. package/skills/askr-routing-layouts/agents/openai.yaml +0 -4
  111. package/skills/askr-runtime-reactivity/SKILL.md +0 -92
  112. package/skills/askr-runtime-reactivity/agents/openai.yaml +0 -4
  113. package/skills/askr-ssr-ssg/SKILL.md +0 -76
  114. package/skills/askr-ssr-ssg/agents/openai.yaml +0 -4
  115. package/skills/askr-testing-determinism/SKILL.md +0 -75
  116. package/skills/askr-testing-determinism/agents/openai.yaml +0 -4
  117. package/skills/askr-theming/SKILL.md +0 -86
  118. package/skills/askr-theming/agents/openai.yaml +0 -4
  119. package/skills/askr-ui-composition/SKILL.md +0 -92
  120. package/skills/askr-ui-composition/agents/openai.yaml +0 -4
  121. package/templates/full-stack/AGENTS.md +0 -11
  122. package/templates/full-stack/README.md +0 -17
  123. package/templates/full-stack/gitignore.template +0 -4
  124. package/templates/full-stack/index.html +0 -13
  125. package/templates/full-stack/package.json +0 -39
  126. package/templates/full-stack/server.ts +0 -9
  127. package/templates/full-stack/src/action-authorizations.ts +0 -10
  128. package/templates/full-stack/src/actions/create-message.ts +0 -10
  129. package/templates/full-stack/src/i18n.ts +0 -8
  130. package/templates/full-stack/src/main.tsx +0 -11
  131. package/templates/full-stack/src/pages/home.tsx +0 -25
  132. package/templates/full-stack/src/pages/layout.tsx +0 -43
  133. package/templates/full-stack/src/pages/not-found.tsx +0 -7
  134. package/templates/full-stack/src/routes.tsx +0 -19
  135. package/templates/full-stack/src/schemas.ts +0 -10
  136. package/templates/full-stack/src/server/action-registry.ts +0 -8
  137. package/templates/full-stack/src/server/actions/create-message.ts +0 -14
  138. package/templates/full-stack/src/server/app.ts +0 -76
  139. package/templates/full-stack/src/server/dependencies.ts +0 -55
  140. package/templates/full-stack/src/server/entry-server.ts +0 -8
  141. package/templates/full-stack/src/telemetry.ts +0 -3
  142. package/templates/full-stack/src/vite-server.d.ts +0 -5
  143. package/templates/full-stack/tests/actions/create-message.test.ts +0 -12
  144. package/templates/full-stack/tsconfig.json +0 -15
  145. package/templates/full-stack/vite.config.ts +0 -10
  146. package/templates/spa/AGENTS.md +0 -60
  147. package/templates/spa/README.md +0 -96
  148. package/templates/spa/gitignore.template +0 -16
  149. package/templates/spa/index.html +0 -13
  150. package/templates/spa/package.json +0 -35
  151. package/templates/spa/src/adapters/operations-client.ts +0 -95
  152. package/templates/spa/src/components/shared/metric-card.tsx +0 -27
  153. package/templates/spa/src/components/shared/status-badge.tsx +0 -24
  154. package/templates/spa/src/features/operations/operations.query.ts +0 -9
  155. package/templates/spa/src/main.tsx +0 -10
  156. package/templates/spa/src/pages/_layout.tsx +0 -9
  157. package/templates/spa/src/pages/_routes.tsx +0 -27
  158. package/templates/spa/src/pages/app/_layout.tsx +0 -94
  159. package/templates/spa/src/pages/app/_routes.tsx +0 -10
  160. package/templates/spa/src/pages/app/admin-home.tsx +0 -170
  161. package/templates/spa/src/pages/app/agent-runs.tsx +0 -93
  162. package/templates/spa/src/pages/app/settings.tsx +0 -91
  163. package/templates/spa/src/pages/auth/_layout.tsx +0 -38
  164. package/templates/spa/src/pages/auth/_routes.tsx +0 -6
  165. package/templates/spa/src/pages/auth/login.tsx +0 -63
  166. package/templates/spa/src/pages/not-found.tsx +0 -22
  167. package/templates/spa/src/pages/public/_layout.tsx +0 -47
  168. package/templates/spa/src/pages/public/_routes.tsx +0 -6
  169. package/templates/spa/src/pages/public/home.tsx +0 -143
  170. package/templates/spa/src/shared/format.ts +0 -12
  171. package/templates/spa/src/shared/navigation.ts +0 -15
  172. package/templates/spa/src/styles/components.css +0 -49
  173. package/templates/spa/src/styles/layout.css +0 -192
  174. package/templates/spa/src/styles/reset.css +0 -44
  175. package/templates/spa/src/styles/theme.css +0 -57
  176. package/templates/spa/src/styles/tokens.css +0 -20
  177. package/templates/spa/src/styles.css +0 -7
  178. package/templates/spa/src/styles.d.ts +0 -1
  179. package/templates/spa/tests/app.test.tsx +0 -37
  180. package/templates/spa/tests/components/shared.test.tsx +0 -12
  181. package/templates/spa/tests/resources.test.ts +0 -22
  182. package/templates/spa/tsconfig.json +0 -20
  183. package/templates/spa/tsconfig.node.json +0 -10
  184. package/templates/spa/vite.config.ts +0 -24
  185. package/templates/spa/vitest.config.ts +0 -17
  186. package/templates/ssg/AGENTS.md +0 -55
  187. package/templates/ssg/README.md +0 -39
  188. package/templates/ssg/gitignore.template +0 -17
  189. package/templates/ssg/index.html +0 -13
  190. package/templates/ssg/package.json +0 -35
  191. package/templates/ssg/src/app.tsx +0 -14
  192. package/templates/ssg/src/components/badge.tsx +0 -3
  193. package/templates/ssg/src/components/counter.tsx +0 -30
  194. package/templates/ssg/src/components/site-shell.tsx +0 -111
  195. package/templates/ssg/src/jsx.d.ts +0 -23
  196. package/templates/ssg/src/main.tsx +0 -8
  197. package/templates/ssg/src/pages/about.tsx +0 -82
  198. package/templates/ssg/src/pages/content.tsx +0 -63
  199. package/templates/ssg/src/pages/example.tsx +0 -97
  200. package/templates/ssg/src/pages/home.tsx +0 -51
  201. package/templates/ssg/src/resources/user.ts +0 -15
  202. package/templates/ssg/src/routes.tsx +0 -15
  203. package/templates/ssg/src/styles.css +0 -89
  204. package/templates/ssg/src/vite-env.d.ts +0 -5
  205. package/templates/ssg/ssg.config.ts +0 -34
  206. package/templates/ssg/tests/app.test.tsx +0 -19
  207. package/templates/ssg/tests/components/counter.test.tsx +0 -18
  208. package/templates/ssg/tests/resources.test.ts +0 -11
  209. package/templates/ssg/tests/ssg-config.test.ts +0 -11
  210. package/templates/ssg/tsconfig.json +0 -20
  211. package/templates/ssg/tsconfig.node.json +0 -10
  212. package/templates/ssg/vite.config.ts +0 -24
  213. package/templates/ssg/vitest.config.ts +0 -17
  214. package/templates/ssr/AGENTS.md +0 -28
  215. package/templates/ssr/README.md +0 -38
  216. package/templates/ssr/gitignore.template +0 -16
  217. package/templates/ssr/index.html +0 -13
  218. package/templates/ssr/package.json +0 -34
  219. package/templates/ssr/server.ts +0 -10
  220. package/templates/ssr/src/app.tsx +0 -21
  221. package/templates/ssr/src/components/counter.tsx +0 -26
  222. package/templates/ssr/src/entry-server.tsx +0 -12
  223. package/templates/ssr/src/main.tsx +0 -11
  224. package/templates/ssr/src/pages/about.tsx +0 -75
  225. package/templates/ssr/src/pages/example.tsx +0 -113
  226. package/templates/ssr/src/pages/home.tsx +0 -56
  227. package/templates/ssr/src/resources/user.ts +0 -15
  228. package/templates/ssr/src/routes.tsx +0 -13
  229. package/templates/ssr/src/styles.css +0 -148
  230. package/templates/ssr/src/vite-server.d.ts +0 -7
  231. package/templates/ssr/tests/app.test.tsx +0 -24
  232. package/templates/ssr/tests/components/counter.test.tsx +0 -13
  233. package/templates/ssr/tests/resources.test.ts +0 -11
  234. package/templates/ssr/tsconfig.json +0 -22
  235. package/templates/ssr/tsconfig.node.json +0 -10
  236. package/templates/ssr/tsconfig.server.json +0 -15
  237. package/templates/ssr/vite.config.ts +0 -25
  238. package/templates/ssr/vitest.config.ts +0 -13
  239. package/templates/startkit/AGENTS.md +0 -77
  240. package/templates/startkit/README.md +0 -192
  241. package/templates/startkit/gitignore.template +0 -16
  242. package/templates/startkit/index.html +0 -13
  243. package/templates/startkit/package.json +0 -35
  244. package/templates/startkit/src/components/app-header.tsx +0 -93
  245. package/templates/startkit/src/components/app-sidebar.tsx +0 -95
  246. package/templates/startkit/src/components/data-table.tsx +0 -80
  247. package/templates/startkit/src/components/empty-state.tsx +0 -13
  248. package/templates/startkit/src/components/page-header.tsx +0 -23
  249. package/templates/startkit/src/components/stat-card.tsx +0 -24
  250. package/templates/startkit/src/features/accounts/account-filters.tsx +0 -61
  251. package/templates/startkit/src/features/accounts/account-table.tsx +0 -79
  252. package/templates/startkit/src/lib/format.ts +0 -31
  253. package/templates/startkit/src/lib/mock-data.ts +0 -441
  254. package/templates/startkit/src/lib/routes.ts +0 -116
  255. package/templates/startkit/src/main.tsx +0 -12
  256. package/templates/startkit/src/pages/_layout.tsx +0 -56
  257. package/templates/startkit/src/pages/auth/_layout.tsx +0 -7
  258. package/templates/startkit/src/pages/auth/login.tsx +0 -129
  259. package/templates/startkit/src/pages/home.tsx +0 -83
  260. package/templates/startkit/src/pages/not-found.tsx +0 -24
  261. package/templates/startkit/src/pages/workspace/_layout.tsx +0 -17
  262. package/templates/startkit/src/pages/workspace/accounts/index.tsx +0 -217
  263. package/templates/startkit/src/pages/workspace/dashboard.tsx +0 -118
  264. package/templates/startkit/src/pages/workspace/settings.tsx +0 -218
  265. package/templates/startkit/src/router.tsx +0 -7
  266. package/templates/startkit/src/routes/auth-config.ts +0 -38
  267. package/templates/startkit/src/routes/auth.ts +0 -8
  268. package/templates/startkit/src/routes/index.ts +0 -28
  269. package/templates/startkit/src/routes/public.ts +0 -8
  270. package/templates/startkit/src/routes/workspace/accounts.ts +0 -8
  271. package/templates/startkit/src/routes/workspace/index.ts +0 -14
  272. package/templates/startkit/src/styles/components.css +0 -396
  273. package/templates/startkit/src/styles/layout.css +0 -192
  274. package/templates/startkit/src/styles/reset.css +0 -38
  275. package/templates/startkit/src/styles/theme.css +0 -76
  276. package/templates/startkit/src/styles/tokens.css +0 -67
  277. package/templates/startkit/src/styles.css +0 -7
  278. package/templates/startkit/src/toast.ts +0 -55
  279. package/templates/startkit/src/utils/join-classes.ts +0 -4
  280. package/templates/startkit/src/vite-env.d.ts +0 -5
  281. package/templates/startkit/tests/app.test.tsx +0 -32
  282. package/templates/startkit/tests/preferences.test.ts +0 -43
  283. package/templates/startkit/tests/resources.test.ts +0 -82
  284. package/templates/startkit/tsconfig.json +0 -20
  285. package/templates/startkit/tsconfig.node.json +0 -10
  286. package/templates/startkit/vite.config.ts +0 -32
  287. package/templates/startkit/vitest.config.ts +0 -13
@@ -1,99 +0,0 @@
1
- ---
2
- name: askr-dashboard-charts
3
- description: Build product dashboards and metric-heavy Askr routes with route-owned async state, shared formatting, and typed @askrjs/charts plots. Use for stat cards, mixed charts, live or follow-latest data, zoom, brush, selection, accessible summaries, and chart exports.
4
- ---
5
-
6
- # Askr Dashboard Charts
7
-
8
- Build dashboards that answer product questions without inventing parallel data, UI, or formatting systems.
9
-
10
- ## Inspect First
11
-
12
- - Inspect the route or feature that owns the data.
13
- - Inspect existing cards, tables, empty states, chart tokens, and format helpers.
14
- - Inspect the nearest existing typed plot. In a generated SPA, start with `src/pages/app/admin-home.tsx`; in the CLI source, use `templates/spa/src/pages/app/admin-home.tsx`.
15
-
16
- ## Keep Ownership Clear
17
-
18
- - Keep loading, empty, error, refresh, and composition state in the route or feature container.
19
- - `src/components/shared` owns reusable stat cards, page headers, tables, and empty states.
20
- - `src/features/<domain>` owns metric workflows and transforms.
21
- - `src/shared` owns formatting helpers so cards, tables, and charts stay consistent.
22
- - Keep row types app-owned; do not import package-owned datum types.
23
-
24
- ## Work In Order
25
-
26
- 1. Load dashboard data with `resource()` unless a wider owner already exists.
27
- 2. Model stable row keys and missing values before choosing marks.
28
- 3. Create each typed plot namespace once at module scope.
29
- 4. Compose the smallest plot that answers the product question.
30
- 5. Import `@askrjs/charts/styles` once at the app boundary.
31
- 6. Pair plots with summaries or on-demand data tables when precision matters.
32
-
33
- ## Compose A Typed Plot
34
-
35
- ```tsx
36
- import { createPlot } from "@askrjs/charts";
37
-
38
- type ThroughputRow = {
39
- id: string;
40
- timestamp: Date;
41
- completed: number;
42
- movingAverage: number;
43
- };
44
-
45
- const ThroughputPlot = createPlot<ThroughputRow>();
46
-
47
- <ThroughputPlot.Root
48
- data={rows}
49
- rowKey="id"
50
- label="Completed runs over time"
51
- title="Run throughput"
52
- description="Completed runs with a moving average."
53
- >
54
- <ThroughputPlot.Bar x="timestamp" y="completed" />
55
- <ThroughputPlot.Line x="timestamp" y="movingAverage" />
56
- <ThroughputPlot.Point x="timestamp" y="movingAverage" />
57
- <ThroughputPlot.Zoom axes="x" />
58
- <ThroughputPlot.Brush axis="x" modifier="shift" />
59
- </ThroughputPlot.Root>;
60
- ```
61
-
62
- ## Handle Mixed, Live, And Interactive Data
63
-
64
- - Use named scales and dual axes only when a mixed plot compares different units.
65
- - Pass a reactive data getter for changing rows and update arrays with `appendPlotRows`, `upsertPlotRows`, `removePlotRows`, or `trimPlotRows`.
66
- - Configure follow-latest by row count or time; let user pan or zoom pause following and provide an explicit `resumeLive()` action.
67
- - Keep `view` and `selection` controlled when route or shared state owns them; otherwise use plot-local state.
68
- - Add zoom, brush, legend filtering, or `onActivate` only when the workflow needs that interaction.
69
- - Keep source and transformed exports distinguishable, and preserve access to visible or selected rows.
70
-
71
- ## Avoid
72
-
73
- - Inline mock metrics inside page JSX.
74
- - Hardcoded chart colors in runtime code.
75
- - Decorative charts that do not answer a product question.
76
- - Calling `createPlot()` inside a component or using unstable row keys.
77
- - Treating missing or non-finite values as zero.
78
- - Dense dashboards without loading, empty, and error states.
79
-
80
- ## Validate
81
-
82
- - Verify cards, tables, tooltips, and exports share formatter logic; keep summaries and tooltip formatters valid for empty or missing rows.
83
- - Verify mobile and desktop layouts in light and dark themes.
84
- - Verify keyboard inspection, selection, zoom, brush, and the on-demand data table when used.
85
- - Verify live updates retain stable selections and pause follow-latest after user navigation.
86
- - Run the app's targeted tests and typecheck before its full acceptance command.
87
-
88
- ## Done When
89
-
90
- - Route-owned async states remain explicit.
91
- - Typed rows and stable keys drive the plot.
92
- - The plot supports the product question without becoming a component gallery.
93
- - Accessible summaries and precise data remain available without relying on canvas pixels.
94
-
95
- ## Handoff
96
-
97
- - Use `askr-resources-data` when async ownership is the real blocker.
98
- - Use `askr-theming` when the hard part is shell and visual coherence.
99
- - Use `askr-testing-determinism` before closing responsive or stateful chart changes.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Askr Dashboard Charts"
3
- short_description: "Compose typed Askr dashboard plots"
4
- default_prompt: "Use $askr-dashboard-charts to build an accessible typed dashboard plot."
@@ -1,86 +0,0 @@
1
- ---
2
- name: askr-design-system
3
- description: Use when creating product-grade Askr interfaces, design-system rules, density, page hierarchy, navigation, forms, tables, panels, action placement, tokens, dark mode, responsive behavior, and operational UI polish.
4
- ---
5
-
6
- # Askr Design System
7
-
8
- Use this only when a repeated product pattern must become shared across multiple screens. This is not the default starting skill for a single UI task.
9
-
10
- ## Inspect First
11
-
12
- - Existing `src/styles`, tokens, theme imports, and shared components.
13
- - `src/components/shared` before adding new UI building blocks.
14
- - `@askrjs/themes` primitives already in use.
15
- - Target product audience and primary workflows.
16
-
17
- ## Use This When
18
-
19
- - The same pattern repeats across three or more screens.
20
- - Theme primitives alone are not enough to express a product-specific shared pattern.
21
- - You need consistent density, hierarchy, and action placement across the app.
22
- - You are about to create a reusable product component, not just style one page.
23
-
24
- ## Product UI Defaults
25
-
26
- - Prefer quiet, dense, scannable SaaS/admin interfaces.
27
- - Use page headers, toolbars, panels, forms, tables, and clear action hierarchy.
28
- - Keep primary actions close to the object or workflow they affect.
29
- - Use icons for familiar tool actions and text for consequential commands.
30
- - Use tokens and semantic slots rather than one-off visual styles.
31
- - Before inventing a component, check `@askrjs/themes` layout, control, surface, feedback, shell, nav, and overlay exports.
32
-
33
- ## Do This In Order
34
-
35
- 1. Prove the pattern is repeated enough to deserve extraction.
36
- 2. Start from existing theme primitives and shared styles.
37
- 3. Extract the smallest product-specific shared component or CSS recipe that removes repetition.
38
- 4. Keep tokens in CSS and keep workflow logic out of design-system components.
39
- 5. Validate the pattern in light, dark, responsive, empty, error, and disabled states.
40
-
41
- ## Start From These Primitives
42
-
43
- - Page width/rhythm: `Container`, `Section`.
44
- - Vertical and horizontal composition: `Stack`, `Inline`, `Flex`.
45
- - Responsive groups: `Block`.
46
- - Low-level layout: `Box`, `Spacer`, `AspectRatio`.
47
- - Product surfaces: `Card`, `Alert`, `Badge`, `ListGroup`, `Separator`, `Skeleton`.
48
- - Forms/actions: `Button`, `ButtonGroup`, `Close`, `Field`, `FieldHint`, `FieldError`, `InputGroup`.
49
- - Async states: `EmptyState`, `Spinner`, plus query/resource state-specific copy.
50
- - App chrome: `Shell`, `ShellNav`, `ShellMain`, `Header`, `Sidebar`, `Navbar`.
51
- - Navigation: `Nav`, `NavLink`, `NavGroup`, `NavBrand`, `Breadcrumb`, `Pagination`.
52
- - Menus: themed `Dropdown`, `Menu`, and `Menubar` from `@askrjs/themes/components`.
53
-
54
- ## Never Do These
55
-
56
- - Route layouts own shell chrome.
57
- - Shared components own repeatable product surfaces.
58
- - Page sections should be unframed layout regions; use cards/panels for repeated items or contained tools.
59
- - Do not wrap cards inside cards; use `Section`, `Container`, `Stack`, and `Block` for page-level composition.
60
- - Tables and forms should be compact but readable.
61
- - Long labels must wrap or truncate intentionally.
62
- - Marketing-page composition for operational apps.
63
- - Decorative gradients, oversized hero panels, or low-density cards in work surfaces.
64
- - Hardcoded colors and spacing outside tokens.
65
- - Component variants that duplicate what CSS state or slots should handle.
66
- - App-local design-system clones of theme primitives.
67
- - Custom CSS grids or flex wrappers when `Block`, `Flex`, `Inline`, or `Stack` already express the layout.
68
-
69
- ## Validate
70
-
71
- - Mobile, tablet, desktop, light, and dark modes are considered.
72
- - Focus, hover, disabled, loading, empty, and error states feel consistent.
73
- - Text does not overflow buttons, cards, navs, tables, or overlays.
74
- - The interface optimizes repeated use, not only first impression.
75
-
76
- ## Done When
77
-
78
- - A repeated product pattern became shared without creating a second component catalog.
79
- - Theme primitives still provide the baseline behavior and styling model.
80
- - The extracted pattern improves coherence across real repeated screens.
81
-
82
- ## Handoff
83
-
84
- - Use `askr-theming` when the next step is token or shell styling.
85
- - Use `askr-ui-composition` when the next step is interactive behavior.
86
- - Use `askr-testing-determinism` before closing broad visual-system changes.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Askr Design System"
3
- short_description: "Shape polished product UI"
4
- default_prompt: "Use $askr-design-system to design an Askr product surface."
@@ -1,74 +0,0 @@
1
- ---
2
- name: askr-env-config
3
- description: Use when configuring Askr apps with environment variables, API base URLs, feature flags, deployment config, local mocks, generated client configuration, and separating config from runtime state.
4
- ---
5
-
6
- # Askr Env Config
7
-
8
- Use this for environment-specific application configuration. The goal is one typed config boundary, explicit public values, and no env reads scattered through UI code.
9
-
10
- ## Use This When
11
-
12
- - You need API base URLs, feature flags, deployment config, or client configuration.
13
- - The app has local mocks, staging behavior, or environment-specific stream endpoints.
14
- - You need missing required config to fail early.
15
- - You want tests to override config deterministically.
16
-
17
- ## Inspect First
18
-
19
- - Existing Vite or runtime environment usage and app config helpers
20
- - Generated API client configuration
21
- - Local mock data and development-only switches
22
- - Deployment target requirements
23
-
24
- ## Put Config In One Boundary
25
-
26
- - Parse and validate config in `src/shared/config` or the repo's existing shared config module.
27
- - Pass API base URLs and auth providers into `src/adapters`.
28
- - Keep feature flags readable from features and pages without coupling them to transport details.
29
- - Keep secrets out of client bundles.
30
-
31
- ## Do This In Order
32
-
33
- 1. Define a typed config object for the public values the client needs.
34
- 2. Validate required values at app startup.
35
- 3. Pass config into adapters and shared helpers instead of reading env values ad hoc.
36
- 4. Keep local mocks explicit and easy to disable.
37
- 5. Name and document reconnect intervals, stale thresholds, or polling settings centrally when the app is event-driven.
38
-
39
- ## Copy This Shape
40
-
41
- ```ts
42
- export const appConfig = {
43
- apiBaseUrl: requireEnv("VITE_API_BASE_URL"),
44
- enableMocks: import.meta.env.VITE_ENABLE_MOCKS === "true",
45
- streamReconnectMs: Number(import.meta.env.VITE_STREAM_RECONNECT_MS ?? 3000),
46
- };
47
- ```
48
-
49
- ## Never Do These
50
-
51
- - Reading env variables directly in many components.
52
- - Shipping server secrets to the browser.
53
- - Hidden dev mocks that change production behavior.
54
- - Feature flags that fork route structure unpredictably.
55
-
56
- ## Validate
57
-
58
- - Missing required config fails early with a useful message.
59
- - API adapters receive config through one boundary.
60
- - Local, staging, and production config paths are obvious.
61
- - Tests can override config deterministically.
62
-
63
- ## Done When
64
-
65
- - Public config is typed and centralized.
66
- - Env reads no longer leak through UI files.
67
- - Event-driven timing or fallback config is explicit where relevant.
68
- - Secret and public config boundaries are clear.
69
-
70
- ## Handoff
71
-
72
- - Use `askr-api-integration` when config shapes adapter behavior.
73
- - Use `askr-realtime-streaming` when reconnect or polling config is the hard part.
74
- - Use `askr-testing-determinism` when config override behavior needs validation.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Askr Env Config"
3
- short_description: "Configure env and feature flags"
4
- default_prompt: "Use $askr-env-config to configure an Askr app environment."
@@ -1,89 +0,0 @@
1
- ---
2
- name: askr-error-loading-empty
3
- description: Use when designing Askr loading, empty, error, stale, refreshing, pending-write, retry, disabled, partial-data, and eventual-consistency UX across routes, tables, forms, dashboards, queries, and mutations.
4
- ---
5
-
6
- # Askr Error Loading Empty
7
-
8
- Use this whenever a feature touches async data or failure states. The goal is one truthful UI meaning per async state.
9
-
10
- ## Use This When
11
-
12
- - You added a `resource()`, `createQuery()`, or `createMutation()` path.
13
- - The screen can load, refresh, fail, be empty, or lag behind a write.
14
- - The UX currently hides too much behind one spinner or one toast.
15
- - The user needs truthful state during eventual consistency.
16
-
17
- ## Inspect First
18
-
19
- - The owner of the async state.
20
- - Existing shared alert, empty-state, skeleton, toast, and status components.
21
- - Query fields such as `loading`, `refreshing`, `stale`, and `consistency`.
22
- - Mutation fields such as `pending`, `error`, `result`, and `status`.
23
-
24
- ## Use This Vocabulary
25
-
26
- - Initial loading: no usable data yet.
27
- - Refreshing: old data is visible while new data loads.
28
- - Empty: request succeeded but no records match.
29
- - Error: request failed and user needs recovery or explanation.
30
- - Partial: some data is usable, some failed or is still loading.
31
- - Pending write: command accepted but read model may not reflect it yet.
32
- - Stale: current read model is known or suspected to be behind.
33
-
34
- ## Do This In Order
35
-
36
- 1. Render a distinct state for initial load, empty, error, refresh, and pending write.
37
- 2. Keep useful old data visible during refresh when it is safe to do so.
38
- 3. Use truthful copy such as `refreshing`, `saved, syncing`, or `reconnecting`.
39
- 4. Disable only the actions that are actually unsafe.
40
- 5. Prefer row-level or local status when only one record is stale or pending.
41
-
42
- ## Copy This Shape
43
-
44
- ```tsx
45
- if (accounts.pending && !accounts.value) {
46
- return <p>Loading accounts...</p>;
47
- }
48
-
49
- if (accounts.error && !accounts.value) {
50
- return <p role="alert">Unable to load accounts.</p>;
51
- }
52
-
53
- return (
54
- <section>
55
- <Show when={accounts.refreshing || accounts.consistency === "pending-write"}>
56
- <p role="status">Saved, syncing...</p>
57
- </Show>
58
-
59
- <Show when={(accounts.value?.items.length ?? 0) === 0}>
60
- <p>No accounts matched this filter.</p>
61
- </Show>
62
-
63
- <AccountsTable rows={accounts.value?.items ?? []} />
64
- </section>
65
- );
66
- ```
67
-
68
- - One spinner for every async state.
69
- - Empty states that hide errors.
70
- - Toast-only errors for important failed workflows.
71
- - Claiming a write is fully complete before the read side confirms it.
72
- - Clearing useful data during refresh.
73
- - Global blocking UI when only one row or one mutation is actually stale.
74
-
75
- ## Validate
76
-
77
- - Initial, refresh, empty, error, stale, and pending-write states are distinct.
78
- - Retry paths call the real owner.
79
- - Important failures are visible without depending only on color or toast.
80
- - Copy tells the truth about eventual consistency.
81
-
82
- ## Done When
83
-
84
- - The screen no longer hides multiple async truths behind one spinner.
85
-
86
- ## Handoff
87
-
88
- - Use `askr-query-mutation` or `askr-resources-data` when the owning state model is still unclear.
89
- - Use `askr-accessibility` when announcements, focus, or row-level status semantics need review.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Askr Error Loading Empty"
3
- short_description: "Design async UX states clearly"
4
- default_prompt: "Use $askr-error-loading-empty to design async UI states."
@@ -1,77 +0,0 @@
1
- ---
2
- name: askr-file-upload-artifacts
3
- description: Use when building Askr file uploads, generated artifacts, progress, previews, validation, storage adapters, downloads, open flows, virus-scan or processing states, and event-sourced artifact readiness.
4
- ---
5
-
6
- # Askr File Upload Artifacts
7
-
8
- Use this for uploads, downloads, previews, and generated files. The goal is one clear upload workflow, explicit processing truth, and no loss of progress or readiness state.
9
-
10
- ## Use This When
11
-
12
- - You need file selection, upload, processing, preview, or download flows.
13
- - Artifacts may be generated asynchronously after upload.
14
- - You need progress, retry, cancellation, or readiness reconciliation.
15
- - Validation rules include type, size, count, privacy, or retention.
16
-
17
- ## Inspect First
18
-
19
- - Adapter support for upload URLs, multipart uploads, or artifact APIs
20
- - Feature workflow for create, upload, process, and download
21
- - File validation rules: type, size, count, privacy, retention
22
- - Artifact processing states and event stream support
23
-
24
- ## Choose The Boundary
25
-
26
- - `src/adapters`: upload transport, signed URL calls, artifact downloads.
27
- - `src/features/<feature>`: validation, upload workflow, and artifact query or mutation state.
28
- - `src/components/shared`: reusable file picker, progress list, and preview shell.
29
- - `src/shared`: size formatting, safe filename helpers, and error normalization.
30
-
31
- ## Do This In Order
32
-
33
- 1. Keep file validation explicit before upload starts.
34
- 2. Model selection, uploading, processing, ready, and failure as separate states.
35
- 3. Preserve upload ID, artifact ID, processing job ID, and last event ID when readiness is asynchronous.
36
- 4. Treat upload completion and artifact readiness as separate truths.
37
- 5. Allow retry or refresh without duplicating uploads where possible.
38
-
39
- ## Copy This Shape
40
-
41
- ```ts
42
- type ArtifactStatus =
43
- | "selected"
44
- | "uploading"
45
- | "processing"
46
- | "ready"
47
- | "failed-validation"
48
- | "failed-upload"
49
- | "failed-processing";
50
- ```
51
-
52
- ## Never Do These
53
-
54
- - Pretending an artifact is ready immediately after upload when processing is asynchronous.
55
- - Client-only validation as the only protection.
56
- - Losing progress and error state on route-local rerenders.
57
- - Download links without accessible names or file metadata.
58
-
59
- ## Validate
60
-
61
- - Validation, upload, processing, ready, and failure states are visible.
62
- - Upload cancellation or retry behavior is explicit.
63
- - Large files and unsupported types fail clearly.
64
- - Artifact readiness is reconciled from server state.
65
-
66
- ## Done When
67
-
68
- - Upload completion and artifact readiness are modeled separately.
69
- - Progress and error state survive the owning workflow.
70
- - Artifact metadata is preserved for retries and reconciliation.
71
- - Users can understand whether a file is uploaded, processing, ready, or failed.
72
-
73
- ## Handoff
74
-
75
- - Use `askr-api-integration` when signed URLs or artifact APIs are the hard part.
76
- - Use `askr-error-loading-empty` when the hard part is presenting processing and failure truth.
77
- - Use `askr-testing-determinism` before closing upload and retry behavior.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Askr File Upload Artifacts"
3
- short_description: "Handle uploads and artifacts"
4
- default_prompt: "Use $askr-file-upload-artifacts to build file workflows."
@@ -1,98 +0,0 @@
1
- ---
2
- name: askr-forms-tables-crud
3
- description: Use when building askr CRUD screens, forms, validation, filters, tables, pagination, selection, bulk actions, confirmation dialogs, row actions, resource/query data flow, and feature folder boundaries.
4
- ---
5
-
6
- # Askr Forms Tables CRUD
7
-
8
- Use this for create, read, update, archive, filter, paginate, and edit workflows. The goal is a predictable split between route composition, feature workflow state, and transport boundaries.
9
-
10
- ## Inspect First
11
-
12
- - The nearest page that owns a table or form.
13
- - The nearest feature folder for the same domain.
14
- - The adapter or service that owns transport.
15
- - Existing tests that cover filtering, submission, or destructive actions.
16
-
17
- ## Use This When
18
-
19
- - You are adding a list, detail, create, edit, archive, or bulk-action flow.
20
- - You need filters, pagination, selection, or row actions.
21
- - You need field validation and server validation errors.
22
- - You need a safe destructive action flow.
23
-
24
- ## Pick The Owner
25
-
26
- - The route or page composes the screen.
27
- - The feature folder owns filters, form state, table columns, queries, and mutations.
28
- - The adapter owns fetch, update, archive, and DTO mapping.
29
- - Shared helpers own cross-cutting formatting and validation helpers when reused.
30
-
31
- ## Copy This Shape
32
-
33
- ```text
34
- src/pages/app/users.tsx
35
- src/features/users/user-table.tsx
36
- src/features/users/user-filters.tsx
37
- src/features/users/user-form.tsx
38
- src/features/users/users.query.ts
39
- src/features/users/users.mutation.ts
40
- src/adapters/users-client.ts
41
- src/shared/format.ts
42
- ```
43
-
44
- Routes compose the screen. Features own domain UI and workflow state. Adapters own transport. Shared helpers own cross-cutting formatting or validation utilities.
45
-
46
- ## Do This In Order
47
-
48
- 1. Choose the async owner first: `resource()` for route-owned reads, `createQuery()` for shared keyed reads, and `createMutation()` for writes.
49
- 2. Keep filters, pagination, dialog state, and selected IDs in local `state()` pairs, and read or write each one through its `[getter, setter]` pair.
50
- 3. Keep field validation and submit handling explicit in the feature layer.
51
- 4. Confirm destructive actions before archive or delete.
52
- 5. Refresh or invalidate after create, update, archive, or delete.
53
-
54
- ## Table Rules
55
-
56
- - Use stable row keys, never index keys for records.
57
- - Put feature-specific columns in the feature folder.
58
- - Use `selector()` for keyed row selection fanout when the table is large or hot.
59
- - Provide loading, empty, error, and disabled action states.
60
- - Keep formatting in `src/shared/format.ts` or a domain feature helper.
61
-
62
- ## Form Rules
63
-
64
- - Keep form state local unless multiple routes need it.
65
- - Put validation rules in `src/features/<feature>` when domain-specific, or `src/shared` when cross-cutting.
66
- - Use `@askrjs/ui` form controls for behavior and accessibility.
67
- - Disable submit while pending and surface field or form errors explicitly.
68
-
69
- - API clients in table, form, or generic UI components.
70
- - Bound live or frequently updating rows so tables and timelines do not churn the whole DOM.
71
- - Keep filtering, sorting, and pagination state together in the feature workflow instead of scattering it across route files.
72
- - Business rules in reusable primitives.
73
- - Hidden destructive actions without confirmation.
74
- - Duplicated pagination/filter logic across route files.
75
- - A table component that imports a raw API client and mutates records directly from row actions.
76
- - A form that shows only a toast on submit failure and never maps field errors back to inputs.
77
- - Pagination, sorting, and filter state duplicated in multiple route pages.
78
-
79
- ## Validate
80
-
81
- - CRUD ownership boundaries are obvious.
82
- - Every async path has loading, error, retry, or disabled feedback.
83
- - Selection, bulk actions, and destructive actions are keyboard reachable.
84
- - Submit handlers preserve pending state and field or form errors.
85
- - Record rows use stable keys.
86
-
87
- ## Done When
88
-
89
- - Form, table, mutation, and adapter ownership are separated.
90
- - Field errors, form errors, pending state, and success state are all visible.
91
- - Selection, filters, sorting, and destructive actions are keyboard reachable.
92
- - Rows keep stable identity and large updates do not force whole-list churn.
93
-
94
- ## Handoff
95
-
96
- - Use `askr-query-mutation` when the form or table state becomes shared keyed state across screens.
97
- - Use `askr-accessibility` when validation, focus, or destructive-action UX is the hard part.
98
- - Use `askr-testing-determinism` to validate submit, retry, selection, and list identity behavior.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Askr Forms Tables CRUD"
3
- short_description: "Build CRUD forms and tables"
4
- default_prompt: "Use $askr-forms-tables-crud to build a CRUD workflow in askr."
@@ -1,109 +0,0 @@
1
- ---
2
- name: askr-mental-model
3
- description: Use when an AI agent or developer needs the canonical Askr mental model, including what Askr is, what it is not, how core primitives fit together, and which React-style assumptions must be rejected.
4
- ---
5
-
6
- # Askr Mental Model
7
-
8
- Use this before building or reviewing Askr code when primitive choice is unclear. This skill exists to keep agents on the native Askr path and off React-shaped defaults.
9
-
10
- ## Use This When
11
-
12
- - Primitive choice is unclear.
13
- - The task looks like React, hooks, or a generic SPA by default.
14
- - You need to decide who owns local state, async reads, or writes.
15
- - You need one obvious Askr-native shape before editing.
16
-
17
- ## Inspect First
18
-
19
- - `AGENTS.md` when it exists
20
- - `src/main.tsx`
21
- - The nearest route file and layout file
22
- - The nearest existing feature that solves a similar problem
23
- - Existing tests for the touched surface
24
-
25
- ## What Askr Expects
26
-
27
- - Route-first ownership.
28
- - Synchronous route components.
29
- - Explicit runtime primitives for state, derived state, lifecycle-owned async work, shared server state, and writes.
30
- - Honest UI for loading, empty, error, stale, and pending-write states.
31
-
32
- ## What Askr Is Not
33
-
34
- - Not a React hooks runtime.
35
- - Not a place to default to `useEffect` data loading.
36
- - Not a reason to add React Router, TanStack Query, or a global state library first.
37
- - Not a place to clone solved `Button`, `Card`, `Sidebar`, `EmptyState`, or shell primitives before checking the existing theme and UI layers.
38
-
39
- ## Pick The Primitive
40
-
41
- - Local mutable UI state: use `state()` as a `[getter, setter]` pair.
42
- - Computed value from reactive reads: use `derive()`.
43
- - One source fans out to many keyed readers: use `selector()`.
44
- - One route or container owns an async read lifecycle: use `resource()`.
45
- - Shared keyed server state used across screens: use `createQuery()`.
46
- - Writes with pending, error, and reconciliation state: use `createMutation()`.
47
- - Keyed or dynamic list identity matters: use `For`.
48
-
49
- ## Copy This Shape
50
-
51
- ```tsx
52
- import { derive, selector, state } from "@askrjs/askr";
53
- import { For } from "@askrjs/askr/control";
54
-
55
- const [selectedId, setSelectedId] = state<string | null>(null);
56
- const isSelected = selector(selectedId);
57
- const items = derive(() => [
58
- { id: "queued", label: "Queued" },
59
- { id: "running", label: "Running" },
60
- { id: "done", label: "Done" },
61
- ]);
62
-
63
- export default function RunFilterBar() {
64
- return (
65
- <nav aria-label="Run status filters">
66
- <For each={items()} by={(item) => item.id}>
67
- {(item) => (
68
- <button
69
- type="button"
70
- aria-pressed={isSelected(item.id)}
71
- onClick={() => setSelectedId(item.id)}
72
- >
73
- {item.label}
74
- </button>
75
- )}
76
- </For>
77
- </nav>
78
- );
79
- }
80
- ```
81
-
82
- ## Reject These Shapes
83
-
84
- - React imports or hook-shaped state as the default solution.
85
- - Effect-driven loading when the UI depends on the async result.
86
- - Treating getters like plain values instead of callable reads.
87
- - Creating runtime helpers conditionally.
88
- - Defaulting to `.map()` for large or dynamic keyed lists where `For` should own identity.
89
- - Hiding data transport, mapping, and mutations inside pages or presentational components.
90
-
91
- ## Validate
92
-
93
- - Primitive choice is explainable in one sentence.
94
- - Route components remain synchronous.
95
- - Keyed UI uses stable IDs.
96
- - No React runtime imports or hook defaults slipped in.
97
- - Async state truth is explicit where the user can observe it.
98
-
99
- ## Done When
100
-
101
- - The code reads like Askr, not like translated React.
102
- - No invented primitives or parallel state layers were added.
103
- - The next narrower skill is obvious from the changed surface.
104
-
105
- ## Handoff
106
-
107
- - Use `askr-routing-layouts` when the next step is route ownership or shell structure.
108
- - Use `askr-resources-data` or `askr-query-mutation` when the next step is async ownership.
109
- - Use `askr-runtime-reactivity` when the next step is local state or keyed rendering behavior.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Askr Mental Model"
3
- short_description: "Learn the canonical Askr runtime model"
4
- default_prompt: "Use $askr-mental-model before building or reviewing Askr application code."