@askrjs/cli 0.0.2

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 (460) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +140 -0
  3. package/dist/add-DqhqRzBQ.js +555 -0
  4. package/dist/add-DqhqRzBQ.js.map +1 -0
  5. package/dist/add.js +3 -0
  6. package/dist/cli.js +91 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/create.js +923 -0
  9. package/dist/create.js.map +1 -0
  10. package/dist/is-direct-execution-Cdlr-ZUl.js +20 -0
  11. package/dist/is-direct-execution-Cdlr-ZUl.js.map +1 -0
  12. package/dist/openapi.js +127 -0
  13. package/dist/openapi.js.map +1 -0
  14. package/dist/skills/askr-accessibility/SKILL.md +68 -0
  15. package/dist/skills/askr-accessibility/agents/openai.yaml +4 -0
  16. package/dist/skills/askr-agent-execution/SKILL.md +85 -0
  17. package/dist/skills/askr-agent-execution/agents/openai.yaml +4 -0
  18. package/dist/skills/askr-agent-workflows/SKILL.md +57 -0
  19. package/dist/skills/askr-agent-workflows/agents/openai.yaml +4 -0
  20. package/dist/skills/askr-api-integration/SKILL.md +79 -0
  21. package/dist/skills/askr-api-integration/agents/openai.yaml +4 -0
  22. package/dist/skills/askr-app-builder/SKILL.md +99 -0
  23. package/dist/skills/askr-app-builder/agents/openai.yaml +4 -0
  24. package/dist/skills/askr-auth-access/SKILL.md +74 -0
  25. package/dist/skills/askr-auth-access/agents/openai.yaml +4 -0
  26. package/dist/skills/askr-cli-vite/SKILL.md +76 -0
  27. package/dist/skills/askr-cli-vite/agents/openai.yaml +4 -0
  28. package/dist/skills/askr-dashboard-charts/SKILL.md +82 -0
  29. package/dist/skills/askr-dashboard-charts/agents/openai.yaml +4 -0
  30. package/dist/skills/askr-design-system/SKILL.md +86 -0
  31. package/dist/skills/askr-design-system/agents/openai.yaml +4 -0
  32. package/dist/skills/askr-env-config/SKILL.md +74 -0
  33. package/dist/skills/askr-env-config/agents/openai.yaml +4 -0
  34. package/dist/skills/askr-error-loading-empty/SKILL.md +89 -0
  35. package/dist/skills/askr-error-loading-empty/agents/openai.yaml +4 -0
  36. package/dist/skills/askr-file-upload-artifacts/SKILL.md +77 -0
  37. package/dist/skills/askr-file-upload-artifacts/agents/openai.yaml +4 -0
  38. package/dist/skills/askr-forms-tables-crud/SKILL.md +98 -0
  39. package/dist/skills/askr-forms-tables-crud/agents/openai.yaml +4 -0
  40. package/dist/skills/askr-mental-model/SKILL.md +109 -0
  41. package/dist/skills/askr-mental-model/agents/openai.yaml +4 -0
  42. package/dist/skills/askr-migration-react/SKILL.md +81 -0
  43. package/dist/skills/askr-migration-react/agents/openai.yaml +4 -0
  44. package/dist/skills/askr-observability-debugging/SKILL.md +83 -0
  45. package/dist/skills/askr-observability-debugging/agents/openai.yaml +4 -0
  46. package/dist/skills/askr-project-structure/SKILL.md +79 -0
  47. package/dist/skills/askr-project-structure/agents/openai.yaml +4 -0
  48. package/dist/skills/askr-query-mutation/SKILL.md +115 -0
  49. package/dist/skills/askr-query-mutation/agents/openai.yaml +4 -0
  50. package/dist/skills/askr-realtime-streaming/SKILL.md +76 -0
  51. package/dist/skills/askr-realtime-streaming/agents/openai.yaml +4 -0
  52. package/dist/skills/askr-resources-data/SKILL.md +100 -0
  53. package/dist/skills/askr-resources-data/agents/openai.yaml +4 -0
  54. package/dist/skills/askr-routing-layouts/SKILL.md +107 -0
  55. package/dist/skills/askr-routing-layouts/agents/openai.yaml +4 -0
  56. package/dist/skills/askr-runtime-reactivity/SKILL.md +92 -0
  57. package/dist/skills/askr-runtime-reactivity/agents/openai.yaml +4 -0
  58. package/dist/skills/askr-ssr-ssg/SKILL.md +76 -0
  59. package/dist/skills/askr-ssr-ssg/agents/openai.yaml +4 -0
  60. package/dist/skills/askr-testing-determinism/SKILL.md +75 -0
  61. package/dist/skills/askr-testing-determinism/agents/openai.yaml +4 -0
  62. package/dist/skills/askr-theming/SKILL.md +86 -0
  63. package/dist/skills/askr-theming/agents/openai.yaml +4 -0
  64. package/dist/skills/askr-ui-composition/SKILL.md +92 -0
  65. package/dist/skills/askr-ui-composition/agents/openai.yaml +4 -0
  66. package/dist/skills-Bh0mEhIx.js +682 -0
  67. package/dist/skills-Bh0mEhIx.js.map +1 -0
  68. package/dist/skills.js +3 -0
  69. package/dist/ssg.js +188 -0
  70. package/dist/ssg.js.map +1 -0
  71. package/dist/templates/full-stack/AGENTS.md +12 -0
  72. package/dist/templates/full-stack/README.md +18 -0
  73. package/dist/templates/full-stack/gitignore.template +4 -0
  74. package/dist/templates/full-stack/index.html +14 -0
  75. package/dist/templates/full-stack/package.json +37 -0
  76. package/dist/templates/full-stack/server.ts +13 -0
  77. package/dist/templates/full-stack/src/action-authorizations.ts +10 -0
  78. package/dist/templates/full-stack/src/actions/create-message.ts +10 -0
  79. package/dist/templates/full-stack/src/i18n.ts +8 -0
  80. package/dist/templates/full-stack/src/main.tsx +12 -0
  81. package/dist/templates/full-stack/src/pages/home.tsx +25 -0
  82. package/dist/templates/full-stack/src/pages/layout.tsx +33 -0
  83. package/dist/templates/full-stack/src/pages/not-found.tsx +4 -0
  84. package/dist/templates/full-stack/src/routes.tsx +20 -0
  85. package/dist/templates/full-stack/src/schemas.ts +11 -0
  86. package/dist/templates/full-stack/src/server/action-registry.ts +12 -0
  87. package/dist/templates/full-stack/src/server/actions/create-message.ts +14 -0
  88. package/dist/templates/full-stack/src/server/app.ts +66 -0
  89. package/dist/templates/full-stack/src/server/dependencies.ts +55 -0
  90. package/dist/templates/full-stack/src/server/entry-server.ts +8 -0
  91. package/dist/templates/full-stack/src/telemetry.ts +4 -0
  92. package/dist/templates/full-stack/src/vite-server.d.ts +6 -0
  93. package/dist/templates/full-stack/tests/actions/create-message.test.ts +13 -0
  94. package/dist/templates/full-stack/tsconfig.json +16 -0
  95. package/dist/templates/full-stack/vite.config.ts +11 -0
  96. package/dist/templates/spa/AGENTS.md +60 -0
  97. package/dist/templates/spa/README.md +96 -0
  98. package/dist/templates/spa/gitignore.template +16 -0
  99. package/dist/templates/spa/index.html +13 -0
  100. package/dist/templates/spa/package.json +35 -0
  101. package/dist/templates/spa/src/adapters/operations-client.ts +90 -0
  102. package/dist/templates/spa/src/components/shared/metric-card.tsx +27 -0
  103. package/dist/templates/spa/src/components/shared/status-badge.tsx +24 -0
  104. package/dist/templates/spa/src/features/operations/operations.query.ts +9 -0
  105. package/dist/templates/spa/src/main.tsx +10 -0
  106. package/dist/templates/spa/src/pages/_layout.tsx +9 -0
  107. package/dist/templates/spa/src/pages/_routes.tsx +27 -0
  108. package/dist/templates/spa/src/pages/app/_layout.tsx +94 -0
  109. package/dist/templates/spa/src/pages/app/_routes.tsx +10 -0
  110. package/dist/templates/spa/src/pages/app/admin-home.tsx +152 -0
  111. package/dist/templates/spa/src/pages/app/agent-runs.tsx +93 -0
  112. package/dist/templates/spa/src/pages/app/settings.tsx +91 -0
  113. package/dist/templates/spa/src/pages/auth/_layout.tsx +38 -0
  114. package/dist/templates/spa/src/pages/auth/_routes.tsx +6 -0
  115. package/dist/templates/spa/src/pages/auth/login.tsx +63 -0
  116. package/dist/templates/spa/src/pages/not-found.tsx +22 -0
  117. package/dist/templates/spa/src/pages/public/_layout.tsx +47 -0
  118. package/dist/templates/spa/src/pages/public/_routes.tsx +6 -0
  119. package/dist/templates/spa/src/pages/public/home.tsx +143 -0
  120. package/dist/templates/spa/src/shared/format.ts +12 -0
  121. package/dist/templates/spa/src/shared/navigation.ts +15 -0
  122. package/dist/templates/spa/src/styles/components.css +49 -0
  123. package/dist/templates/spa/src/styles/layout.css +192 -0
  124. package/dist/templates/spa/src/styles/reset.css +44 -0
  125. package/dist/templates/spa/src/styles/theme.css +57 -0
  126. package/dist/templates/spa/src/styles/tokens.css +20 -0
  127. package/dist/templates/spa/src/styles.css +7 -0
  128. package/dist/templates/spa/src/styles.d.ts +1 -0
  129. package/dist/templates/spa/tests/app.test.tsx +37 -0
  130. package/dist/templates/spa/tests/components/shared.test.tsx +12 -0
  131. package/dist/templates/spa/tests/resources.test.ts +22 -0
  132. package/dist/templates/spa/tsconfig.json +20 -0
  133. package/dist/templates/spa/tsconfig.node.json +10 -0
  134. package/dist/templates/spa/vite.config.ts +24 -0
  135. package/dist/templates/spa/vitest.config.ts +17 -0
  136. package/dist/templates/ssg/AGENTS.md +55 -0
  137. package/dist/templates/ssg/README.md +39 -0
  138. package/dist/templates/ssg/gitignore.template +17 -0
  139. package/dist/templates/ssg/index.html +13 -0
  140. package/dist/templates/ssg/package.json +35 -0
  141. package/dist/templates/ssg/src/app.tsx +14 -0
  142. package/dist/templates/ssg/src/components/badge.tsx +3 -0
  143. package/dist/templates/ssg/src/components/counter.tsx +30 -0
  144. package/dist/templates/ssg/src/components/site-shell.tsx +111 -0
  145. package/dist/templates/ssg/src/jsx.d.ts +23 -0
  146. package/dist/templates/ssg/src/main.tsx +8 -0
  147. package/dist/templates/ssg/src/pages/about.tsx +82 -0
  148. package/dist/templates/ssg/src/pages/content.tsx +63 -0
  149. package/dist/templates/ssg/src/pages/example.tsx +97 -0
  150. package/dist/templates/ssg/src/pages/home.tsx +51 -0
  151. package/dist/templates/ssg/src/resources/user.ts +15 -0
  152. package/dist/templates/ssg/src/routes.tsx +15 -0
  153. package/dist/templates/ssg/src/styles.css +89 -0
  154. package/dist/templates/ssg/src/vite-env.d.ts +5 -0
  155. package/dist/templates/ssg/ssg.config.ts +34 -0
  156. package/dist/templates/ssg/tests/app.test.tsx +19 -0
  157. package/dist/templates/ssg/tests/components/counter.test.tsx +18 -0
  158. package/dist/templates/ssg/tests/resources.test.ts +11 -0
  159. package/dist/templates/ssg/tests/ssg-config.test.ts +11 -0
  160. package/dist/templates/ssg/tsconfig.json +20 -0
  161. package/dist/templates/ssg/tsconfig.node.json +10 -0
  162. package/dist/templates/ssg/vite.config.ts +24 -0
  163. package/dist/templates/ssg/vitest.config.ts +17 -0
  164. package/dist/templates/ssr/AGENTS.md +28 -0
  165. package/dist/templates/ssr/README.md +38 -0
  166. package/dist/templates/ssr/gitignore.template +16 -0
  167. package/dist/templates/ssr/index.html +13 -0
  168. package/dist/templates/ssr/package.json +34 -0
  169. package/dist/templates/ssr/server.ts +16 -0
  170. package/dist/templates/ssr/src/app.tsx +21 -0
  171. package/dist/templates/ssr/src/components/counter.tsx +26 -0
  172. package/dist/templates/ssr/src/entry-server.tsx +10 -0
  173. package/dist/templates/ssr/src/main.tsx +11 -0
  174. package/dist/templates/ssr/src/pages/about.tsx +75 -0
  175. package/dist/templates/ssr/src/pages/example.tsx +113 -0
  176. package/dist/templates/ssr/src/pages/home.tsx +56 -0
  177. package/dist/templates/ssr/src/resources/user.ts +15 -0
  178. package/dist/templates/ssr/src/routes.tsx +13 -0
  179. package/dist/templates/ssr/src/styles.css +148 -0
  180. package/dist/templates/ssr/src/vite-server.d.ts +7 -0
  181. package/dist/templates/ssr/tests/app.test.tsx +24 -0
  182. package/dist/templates/ssr/tests/components/counter.test.tsx +13 -0
  183. package/dist/templates/ssr/tests/resources.test.ts +11 -0
  184. package/dist/templates/ssr/tsconfig.json +22 -0
  185. package/dist/templates/ssr/tsconfig.node.json +10 -0
  186. package/dist/templates/ssr/tsconfig.server.json +15 -0
  187. package/dist/templates/ssr/vite.config.ts +25 -0
  188. package/dist/templates/ssr/vitest.config.ts +13 -0
  189. package/dist/templates/startkit/AGENTS.md +77 -0
  190. package/dist/templates/startkit/README.md +192 -0
  191. package/dist/templates/startkit/gitignore.template +16 -0
  192. package/dist/templates/startkit/index.html +13 -0
  193. package/dist/templates/startkit/package.json +35 -0
  194. package/dist/templates/startkit/src/components/app-header.tsx +93 -0
  195. package/dist/templates/startkit/src/components/app-sidebar.tsx +95 -0
  196. package/dist/templates/startkit/src/components/data-table.tsx +80 -0
  197. package/dist/templates/startkit/src/components/empty-state.tsx +13 -0
  198. package/dist/templates/startkit/src/components/page-header.tsx +23 -0
  199. package/dist/templates/startkit/src/components/stat-card.tsx +24 -0
  200. package/dist/templates/startkit/src/features/accounts/account-filters.tsx +61 -0
  201. package/dist/templates/startkit/src/features/accounts/account-table.tsx +79 -0
  202. package/dist/templates/startkit/src/lib/format.ts +31 -0
  203. package/dist/templates/startkit/src/lib/mock-data.ts +441 -0
  204. package/dist/templates/startkit/src/lib/routes.ts +116 -0
  205. package/dist/templates/startkit/src/main.tsx +12 -0
  206. package/dist/templates/startkit/src/pages/_layout.tsx +56 -0
  207. package/dist/templates/startkit/src/pages/auth/_layout.tsx +7 -0
  208. package/dist/templates/startkit/src/pages/auth/login.tsx +129 -0
  209. package/dist/templates/startkit/src/pages/home.tsx +83 -0
  210. package/dist/templates/startkit/src/pages/not-found.tsx +24 -0
  211. package/dist/templates/startkit/src/pages/workspace/_layout.tsx +17 -0
  212. package/dist/templates/startkit/src/pages/workspace/accounts/index.tsx +217 -0
  213. package/dist/templates/startkit/src/pages/workspace/dashboard.tsx +118 -0
  214. package/dist/templates/startkit/src/pages/workspace/settings.tsx +218 -0
  215. package/dist/templates/startkit/src/router.tsx +7 -0
  216. package/dist/templates/startkit/src/routes/auth-config.ts +38 -0
  217. package/dist/templates/startkit/src/routes/auth.ts +8 -0
  218. package/dist/templates/startkit/src/routes/index.ts +28 -0
  219. package/dist/templates/startkit/src/routes/public.ts +8 -0
  220. package/dist/templates/startkit/src/routes/workspace/accounts.ts +8 -0
  221. package/dist/templates/startkit/src/routes/workspace/index.ts +14 -0
  222. package/dist/templates/startkit/src/styles/components.css +396 -0
  223. package/dist/templates/startkit/src/styles/layout.css +192 -0
  224. package/dist/templates/startkit/src/styles/reset.css +38 -0
  225. package/dist/templates/startkit/src/styles/theme.css +76 -0
  226. package/dist/templates/startkit/src/styles/tokens.css +67 -0
  227. package/dist/templates/startkit/src/styles.css +7 -0
  228. package/dist/templates/startkit/src/toast.ts +55 -0
  229. package/dist/templates/startkit/src/utils/join-classes.ts +4 -0
  230. package/dist/templates/startkit/src/vite-env.d.ts +5 -0
  231. package/dist/templates/startkit/tests/app.test.tsx +32 -0
  232. package/dist/templates/startkit/tests/preferences.test.ts +43 -0
  233. package/dist/templates/startkit/tests/resources.test.ts +82 -0
  234. package/dist/templates/startkit/tsconfig.json +20 -0
  235. package/dist/templates/startkit/tsconfig.node.json +10 -0
  236. package/dist/templates/startkit/vite.config.ts +32 -0
  237. package/dist/templates/startkit/vitest.config.ts +13 -0
  238. package/dist/update-DyW1na5V.js +1140 -0
  239. package/dist/update-DyW1na5V.js.map +1 -0
  240. package/dist/update.js +3 -0
  241. package/package.json +84 -0
  242. package/skills/askr-accessibility/SKILL.md +68 -0
  243. package/skills/askr-accessibility/agents/openai.yaml +4 -0
  244. package/skills/askr-agent-execution/SKILL.md +85 -0
  245. package/skills/askr-agent-execution/agents/openai.yaml +4 -0
  246. package/skills/askr-agent-workflows/SKILL.md +57 -0
  247. package/skills/askr-agent-workflows/agents/openai.yaml +4 -0
  248. package/skills/askr-api-integration/SKILL.md +79 -0
  249. package/skills/askr-api-integration/agents/openai.yaml +4 -0
  250. package/skills/askr-app-builder/SKILL.md +99 -0
  251. package/skills/askr-app-builder/agents/openai.yaml +4 -0
  252. package/skills/askr-auth-access/SKILL.md +74 -0
  253. package/skills/askr-auth-access/agents/openai.yaml +4 -0
  254. package/skills/askr-cli-vite/SKILL.md +76 -0
  255. package/skills/askr-cli-vite/agents/openai.yaml +4 -0
  256. package/skills/askr-dashboard-charts/SKILL.md +82 -0
  257. package/skills/askr-dashboard-charts/agents/openai.yaml +4 -0
  258. package/skills/askr-design-system/SKILL.md +86 -0
  259. package/skills/askr-design-system/agents/openai.yaml +4 -0
  260. package/skills/askr-env-config/SKILL.md +74 -0
  261. package/skills/askr-env-config/agents/openai.yaml +4 -0
  262. package/skills/askr-error-loading-empty/SKILL.md +89 -0
  263. package/skills/askr-error-loading-empty/agents/openai.yaml +4 -0
  264. package/skills/askr-file-upload-artifacts/SKILL.md +77 -0
  265. package/skills/askr-file-upload-artifacts/agents/openai.yaml +4 -0
  266. package/skills/askr-forms-tables-crud/SKILL.md +98 -0
  267. package/skills/askr-forms-tables-crud/agents/openai.yaml +4 -0
  268. package/skills/askr-mental-model/SKILL.md +109 -0
  269. package/skills/askr-mental-model/agents/openai.yaml +4 -0
  270. package/skills/askr-migration-react/SKILL.md +81 -0
  271. package/skills/askr-migration-react/agents/openai.yaml +4 -0
  272. package/skills/askr-observability-debugging/SKILL.md +83 -0
  273. package/skills/askr-observability-debugging/agents/openai.yaml +4 -0
  274. package/skills/askr-project-structure/SKILL.md +79 -0
  275. package/skills/askr-project-structure/agents/openai.yaml +4 -0
  276. package/skills/askr-query-mutation/SKILL.md +115 -0
  277. package/skills/askr-query-mutation/agents/openai.yaml +4 -0
  278. package/skills/askr-realtime-streaming/SKILL.md +76 -0
  279. package/skills/askr-realtime-streaming/agents/openai.yaml +4 -0
  280. package/skills/askr-resources-data/SKILL.md +100 -0
  281. package/skills/askr-resources-data/agents/openai.yaml +4 -0
  282. package/skills/askr-routing-layouts/SKILL.md +107 -0
  283. package/skills/askr-routing-layouts/agents/openai.yaml +4 -0
  284. package/skills/askr-runtime-reactivity/SKILL.md +92 -0
  285. package/skills/askr-runtime-reactivity/agents/openai.yaml +4 -0
  286. package/skills/askr-ssr-ssg/SKILL.md +76 -0
  287. package/skills/askr-ssr-ssg/agents/openai.yaml +4 -0
  288. package/skills/askr-testing-determinism/SKILL.md +75 -0
  289. package/skills/askr-testing-determinism/agents/openai.yaml +4 -0
  290. package/skills/askr-theming/SKILL.md +86 -0
  291. package/skills/askr-theming/agents/openai.yaml +4 -0
  292. package/skills/askr-ui-composition/SKILL.md +92 -0
  293. package/skills/askr-ui-composition/agents/openai.yaml +4 -0
  294. package/templates/full-stack/AGENTS.md +12 -0
  295. package/templates/full-stack/README.md +18 -0
  296. package/templates/full-stack/gitignore.template +4 -0
  297. package/templates/full-stack/index.html +14 -0
  298. package/templates/full-stack/package.json +37 -0
  299. package/templates/full-stack/server.ts +13 -0
  300. package/templates/full-stack/src/action-authorizations.ts +10 -0
  301. package/templates/full-stack/src/actions/create-message.ts +10 -0
  302. package/templates/full-stack/src/i18n.ts +8 -0
  303. package/templates/full-stack/src/main.tsx +12 -0
  304. package/templates/full-stack/src/pages/home.tsx +25 -0
  305. package/templates/full-stack/src/pages/layout.tsx +33 -0
  306. package/templates/full-stack/src/pages/not-found.tsx +4 -0
  307. package/templates/full-stack/src/routes.tsx +20 -0
  308. package/templates/full-stack/src/schemas.ts +11 -0
  309. package/templates/full-stack/src/server/action-registry.ts +12 -0
  310. package/templates/full-stack/src/server/actions/create-message.ts +14 -0
  311. package/templates/full-stack/src/server/app.ts +66 -0
  312. package/templates/full-stack/src/server/dependencies.ts +55 -0
  313. package/templates/full-stack/src/server/entry-server.ts +8 -0
  314. package/templates/full-stack/src/telemetry.ts +4 -0
  315. package/templates/full-stack/src/vite-server.d.ts +6 -0
  316. package/templates/full-stack/tests/actions/create-message.test.ts +13 -0
  317. package/templates/full-stack/tsconfig.json +16 -0
  318. package/templates/full-stack/vite.config.ts +11 -0
  319. package/templates/spa/AGENTS.md +60 -0
  320. package/templates/spa/README.md +96 -0
  321. package/templates/spa/gitignore.template +16 -0
  322. package/templates/spa/index.html +13 -0
  323. package/templates/spa/package.json +35 -0
  324. package/templates/spa/src/adapters/operations-client.ts +90 -0
  325. package/templates/spa/src/components/shared/metric-card.tsx +27 -0
  326. package/templates/spa/src/components/shared/status-badge.tsx +24 -0
  327. package/templates/spa/src/features/operations/operations.query.ts +9 -0
  328. package/templates/spa/src/main.tsx +10 -0
  329. package/templates/spa/src/pages/_layout.tsx +9 -0
  330. package/templates/spa/src/pages/_routes.tsx +27 -0
  331. package/templates/spa/src/pages/app/_layout.tsx +94 -0
  332. package/templates/spa/src/pages/app/_routes.tsx +10 -0
  333. package/templates/spa/src/pages/app/admin-home.tsx +152 -0
  334. package/templates/spa/src/pages/app/agent-runs.tsx +93 -0
  335. package/templates/spa/src/pages/app/settings.tsx +91 -0
  336. package/templates/spa/src/pages/auth/_layout.tsx +38 -0
  337. package/templates/spa/src/pages/auth/_routes.tsx +6 -0
  338. package/templates/spa/src/pages/auth/login.tsx +63 -0
  339. package/templates/spa/src/pages/not-found.tsx +22 -0
  340. package/templates/spa/src/pages/public/_layout.tsx +47 -0
  341. package/templates/spa/src/pages/public/_routes.tsx +6 -0
  342. package/templates/spa/src/pages/public/home.tsx +143 -0
  343. package/templates/spa/src/shared/format.ts +12 -0
  344. package/templates/spa/src/shared/navigation.ts +15 -0
  345. package/templates/spa/src/styles/components.css +49 -0
  346. package/templates/spa/src/styles/layout.css +192 -0
  347. package/templates/spa/src/styles/reset.css +44 -0
  348. package/templates/spa/src/styles/theme.css +57 -0
  349. package/templates/spa/src/styles/tokens.css +20 -0
  350. package/templates/spa/src/styles.css +7 -0
  351. package/templates/spa/src/styles.d.ts +1 -0
  352. package/templates/spa/tests/app.test.tsx +37 -0
  353. package/templates/spa/tests/components/shared.test.tsx +12 -0
  354. package/templates/spa/tests/resources.test.ts +22 -0
  355. package/templates/spa/tsconfig.json +20 -0
  356. package/templates/spa/tsconfig.node.json +10 -0
  357. package/templates/spa/vite.config.ts +24 -0
  358. package/templates/spa/vitest.config.ts +17 -0
  359. package/templates/ssg/AGENTS.md +55 -0
  360. package/templates/ssg/README.md +39 -0
  361. package/templates/ssg/gitignore.template +17 -0
  362. package/templates/ssg/index.html +13 -0
  363. package/templates/ssg/package.json +35 -0
  364. package/templates/ssg/src/app.tsx +14 -0
  365. package/templates/ssg/src/components/badge.tsx +3 -0
  366. package/templates/ssg/src/components/counter.tsx +30 -0
  367. package/templates/ssg/src/components/site-shell.tsx +111 -0
  368. package/templates/ssg/src/jsx.d.ts +23 -0
  369. package/templates/ssg/src/main.tsx +8 -0
  370. package/templates/ssg/src/pages/about.tsx +82 -0
  371. package/templates/ssg/src/pages/content.tsx +63 -0
  372. package/templates/ssg/src/pages/example.tsx +97 -0
  373. package/templates/ssg/src/pages/home.tsx +51 -0
  374. package/templates/ssg/src/resources/user.ts +15 -0
  375. package/templates/ssg/src/routes.tsx +15 -0
  376. package/templates/ssg/src/styles.css +89 -0
  377. package/templates/ssg/src/vite-env.d.ts +5 -0
  378. package/templates/ssg/ssg.config.ts +34 -0
  379. package/templates/ssg/tests/app.test.tsx +19 -0
  380. package/templates/ssg/tests/components/counter.test.tsx +18 -0
  381. package/templates/ssg/tests/resources.test.ts +11 -0
  382. package/templates/ssg/tests/ssg-config.test.ts +11 -0
  383. package/templates/ssg/tsconfig.json +20 -0
  384. package/templates/ssg/tsconfig.node.json +10 -0
  385. package/templates/ssg/vite.config.ts +24 -0
  386. package/templates/ssg/vitest.config.ts +17 -0
  387. package/templates/ssr/AGENTS.md +28 -0
  388. package/templates/ssr/README.md +38 -0
  389. package/templates/ssr/gitignore.template +16 -0
  390. package/templates/ssr/index.html +13 -0
  391. package/templates/ssr/package.json +34 -0
  392. package/templates/ssr/server.ts +16 -0
  393. package/templates/ssr/src/app.tsx +21 -0
  394. package/templates/ssr/src/components/counter.tsx +26 -0
  395. package/templates/ssr/src/entry-server.tsx +10 -0
  396. package/templates/ssr/src/main.tsx +11 -0
  397. package/templates/ssr/src/pages/about.tsx +75 -0
  398. package/templates/ssr/src/pages/example.tsx +113 -0
  399. package/templates/ssr/src/pages/home.tsx +56 -0
  400. package/templates/ssr/src/resources/user.ts +15 -0
  401. package/templates/ssr/src/routes.tsx +13 -0
  402. package/templates/ssr/src/styles.css +148 -0
  403. package/templates/ssr/src/vite-server.d.ts +7 -0
  404. package/templates/ssr/tests/app.test.tsx +24 -0
  405. package/templates/ssr/tests/components/counter.test.tsx +13 -0
  406. package/templates/ssr/tests/resources.test.ts +11 -0
  407. package/templates/ssr/tsconfig.json +22 -0
  408. package/templates/ssr/tsconfig.node.json +10 -0
  409. package/templates/ssr/tsconfig.server.json +15 -0
  410. package/templates/ssr/vite.config.ts +25 -0
  411. package/templates/ssr/vitest.config.ts +13 -0
  412. package/templates/startkit/AGENTS.md +77 -0
  413. package/templates/startkit/README.md +192 -0
  414. package/templates/startkit/gitignore.template +16 -0
  415. package/templates/startkit/index.html +13 -0
  416. package/templates/startkit/package.json +35 -0
  417. package/templates/startkit/src/components/app-header.tsx +93 -0
  418. package/templates/startkit/src/components/app-sidebar.tsx +95 -0
  419. package/templates/startkit/src/components/data-table.tsx +80 -0
  420. package/templates/startkit/src/components/empty-state.tsx +13 -0
  421. package/templates/startkit/src/components/page-header.tsx +23 -0
  422. package/templates/startkit/src/components/stat-card.tsx +24 -0
  423. package/templates/startkit/src/features/accounts/account-filters.tsx +61 -0
  424. package/templates/startkit/src/features/accounts/account-table.tsx +79 -0
  425. package/templates/startkit/src/lib/format.ts +31 -0
  426. package/templates/startkit/src/lib/mock-data.ts +441 -0
  427. package/templates/startkit/src/lib/routes.ts +116 -0
  428. package/templates/startkit/src/main.tsx +12 -0
  429. package/templates/startkit/src/pages/_layout.tsx +56 -0
  430. package/templates/startkit/src/pages/auth/_layout.tsx +7 -0
  431. package/templates/startkit/src/pages/auth/login.tsx +129 -0
  432. package/templates/startkit/src/pages/home.tsx +83 -0
  433. package/templates/startkit/src/pages/not-found.tsx +24 -0
  434. package/templates/startkit/src/pages/workspace/_layout.tsx +17 -0
  435. package/templates/startkit/src/pages/workspace/accounts/index.tsx +217 -0
  436. package/templates/startkit/src/pages/workspace/dashboard.tsx +118 -0
  437. package/templates/startkit/src/pages/workspace/settings.tsx +218 -0
  438. package/templates/startkit/src/router.tsx +7 -0
  439. package/templates/startkit/src/routes/auth-config.ts +38 -0
  440. package/templates/startkit/src/routes/auth.ts +8 -0
  441. package/templates/startkit/src/routes/index.ts +28 -0
  442. package/templates/startkit/src/routes/public.ts +8 -0
  443. package/templates/startkit/src/routes/workspace/accounts.ts +8 -0
  444. package/templates/startkit/src/routes/workspace/index.ts +14 -0
  445. package/templates/startkit/src/styles/components.css +396 -0
  446. package/templates/startkit/src/styles/layout.css +192 -0
  447. package/templates/startkit/src/styles/reset.css +38 -0
  448. package/templates/startkit/src/styles/theme.css +76 -0
  449. package/templates/startkit/src/styles/tokens.css +67 -0
  450. package/templates/startkit/src/styles.css +7 -0
  451. package/templates/startkit/src/toast.ts +55 -0
  452. package/templates/startkit/src/utils/join-classes.ts +4 -0
  453. package/templates/startkit/src/vite-env.d.ts +5 -0
  454. package/templates/startkit/tests/app.test.tsx +32 -0
  455. package/templates/startkit/tests/preferences.test.ts +43 -0
  456. package/templates/startkit/tests/resources.test.ts +82 -0
  457. package/templates/startkit/tsconfig.json +20 -0
  458. package/templates/startkit/tsconfig.node.json +10 -0
  459. package/templates/startkit/vite.config.ts +32 -0
  460. package/templates/startkit/vitest.config.ts +13 -0
@@ -0,0 +1,93 @@
1
+ import {
2
+ BotIcon,
3
+ CheckCircle2Icon,
4
+ Clock3Icon,
5
+ ShieldAlertIcon,
6
+ } from '@askrjs/lucide';
7
+ import {
8
+ Badge,
9
+ Card,
10
+ CardContent,
11
+ CardDescription,
12
+ CardHeader,
13
+ CardTitle,
14
+ } from '@askrjs/themes/components';
15
+ import { Block, Inline, Stack } from '@askrjs/themes/components';
16
+ import StatusBadge, {
17
+ type RunStatus,
18
+ } from '../../components/shared/status-badge';
19
+
20
+ const runs: Array<{
21
+ title: string;
22
+ status: RunStatus;
23
+ event: string;
24
+ description: string;
25
+ }> = [
26
+ {
27
+ title: 'Reconcile billing projection',
28
+ status: 'running',
29
+ event: 'tool call: compare-ledger',
30
+ description:
31
+ 'Streaming events are appended to the timeline and reconciled by event id.',
32
+ },
33
+ {
34
+ title: 'Approve enterprise workspace',
35
+ status: 'requires-action',
36
+ event: 'approval requested',
37
+ description:
38
+ 'Human gates are explicit product states, not hidden inside generated text.',
39
+ },
40
+ {
41
+ title: 'Refresh onboarding cohort',
42
+ status: 'succeeded',
43
+ event: 'projection caught up',
44
+ description:
45
+ 'The read model confirms the command reached the user-visible view.',
46
+ },
47
+ ];
48
+
49
+ export default function AgentRunsPage() {
50
+ return (
51
+ <Stack gap="5">
52
+ <section class="page-heading">
53
+ <Stack gap="2">
54
+ <Badge>agent workflows</Badge>
55
+ <h1>Agent runs</h1>
56
+ <p class="lead">
57
+ Timelines make queued, running, approval, failure, and projection
58
+ catch-up states easy to inspect.
59
+ </p>
60
+ </Stack>
61
+ </section>
62
+
63
+ <Block gap="md" class="agent-grid">
64
+ {runs.map((run) => (
65
+ <Card>
66
+ <CardHeader>
67
+ <Inline justify="between" align="start" gap="3">
68
+ <span class="card-icon">
69
+ {run.status === 'succeeded' ? (
70
+ <CheckCircle2Icon size={18} aria-hidden="true" />
71
+ ) : run.status === 'requires-action' ? (
72
+ <ShieldAlertIcon size={18} aria-hidden="true" />
73
+ ) : (
74
+ <BotIcon size={18} aria-hidden="true" />
75
+ )}
76
+ </span>
77
+ <StatusBadge status={run.status} />
78
+ </Inline>
79
+ <CardTitle>{run.title}</CardTitle>
80
+ <CardDescription>{run.description}</CardDescription>
81
+ </CardHeader>
82
+ <CardContent>
83
+ <Inline gap="2" align="center">
84
+ <Clock3Icon size={14} aria-hidden="true" />
85
+ <span>{run.event}</span>
86
+ </Inline>
87
+ </CardContent>
88
+ </Card>
89
+ ))}
90
+ </Block>
91
+ </Stack>
92
+ );
93
+ }
@@ -0,0 +1,91 @@
1
+ import { state } from '@askrjs/askr';
2
+ import { Input } from '@askrjs/ui';
3
+ import {
4
+ Button,
5
+ Field,
6
+ FieldHint,
7
+ InputGroup,
8
+ InputGroupText,
9
+ } from '@askrjs/themes/components';
10
+ import {
11
+ Badge,
12
+ Card,
13
+ CardContent,
14
+ CardDescription,
15
+ CardHeader,
16
+ CardTitle,
17
+ } from '@askrjs/themes/components';
18
+ import { Block, Stack } from '@askrjs/themes/components';
19
+
20
+ export default function SettingsPage() {
21
+ const [endpoint, setEndpoint] = state(
22
+ 'https://api.example.test'
23
+ ) as unknown as [
24
+ ReturnType<typeof state<string>>,
25
+ ReturnType<typeof state<string>>['set'],
26
+ ];
27
+
28
+ return (
29
+ <Stack gap="5">
30
+ <section class="page-heading">
31
+ <Stack gap="2">
32
+ <Badge>environment</Badge>
33
+ <h1>Settings</h1>
34
+ <p class="lead">
35
+ Configuration stays in shared boundaries and adapters receive it
36
+ through one clear path.
37
+ </p>
38
+ </Stack>
39
+ </section>
40
+
41
+ <Block gap="md" align="start" class="settings-grid">
42
+ <Card>
43
+ <CardHeader>
44
+ <CardTitle>API adapter</CardTitle>
45
+ <CardDescription>
46
+ Keep generated clients and transport concerns out of route
47
+ components.
48
+ </CardDescription>
49
+ </CardHeader>
50
+ <CardContent>
51
+ <Field>
52
+ <label htmlFor="api-endpoint">Base URL</label>
53
+ <InputGroup>
54
+ <InputGroupText>URL</InputGroupText>
55
+ <Input
56
+ id="api-endpoint"
57
+ value={endpoint()}
58
+ onInput={(event: Event) =>
59
+ setEndpoint((event.currentTarget as HTMLInputElement).value)
60
+ }
61
+ />
62
+ </InputGroup>
63
+ <FieldHint>
64
+ Demo-only value. Real apps should validate public config at
65
+ startup.
66
+ </FieldHint>
67
+ </Field>
68
+ </CardContent>
69
+ </Card>
70
+
71
+ <Card>
72
+ <CardHeader>
73
+ <CardTitle>Consistency policy</CardTitle>
74
+ <CardDescription>
75
+ Event-sourced apps should expose lag, retries, and stale states
76
+ directly.
77
+ </CardDescription>
78
+ </CardHeader>
79
+ <CardContent>
80
+ <Stack gap="3">
81
+ <Badge>pending-write copy enabled</Badge>
82
+ <Badge>projection lag visible</Badge>
83
+ <Badge>manual refresh available</Badge>
84
+ <Button variant="secondary">Save settings</Button>
85
+ </Stack>
86
+ </CardContent>
87
+ </Card>
88
+ </Block>
89
+ </Stack>
90
+ );
91
+ }
@@ -0,0 +1,38 @@
1
+ import { Link } from '@askrjs/askr/router';
2
+ import { MoonIcon, SunIcon } from '@askrjs/lucide';
3
+ import { Button } from '@askrjs/themes/components';
4
+ import { Container, Inline } from '@askrjs/themes/components';
5
+ import { Header } from '@askrjs/themes/components';
6
+ import { ThemeToggle } from '@askrjs/themes/theme';
7
+
8
+ export default function AuthLayout({ children }: { children?: unknown }) {
9
+ return (
10
+ <div class="auth-shell">
11
+ <Header position="sticky" class="auth-header">
12
+ <Container size="full">
13
+ <Inline justify="between" align="center" gap="3" wrap="wrap">
14
+ <Link href="/" class="brand-link">
15
+ <span class="brand-mark">A</span>
16
+ <strong>{'{{appName}}'}</strong>
17
+ </Link>
18
+ <Inline gap="2" align="center" wrap="wrap">
19
+ <ThemeToggle
20
+ variant="ghost"
21
+ size="icon"
22
+ aria-label="Toggle color theme"
23
+ lightIcon={<SunIcon size={18} aria-hidden="true" />}
24
+ darkIcon={<MoonIcon size={18} aria-hidden="true" />}
25
+ />
26
+ <Button variant="secondary" asChild>
27
+ <Link href="/">Back to site</Link>
28
+ </Button>
29
+ </Inline>
30
+ </Inline>
31
+ </Container>
32
+ </Header>
33
+ <main class="auth-main">
34
+ <Container size="sm">{children}</Container>
35
+ </main>
36
+ </div>
37
+ );
38
+ }
@@ -0,0 +1,6 @@
1
+ import { route } from '@askrjs/askr/router';
2
+ import LoginPage from './login';
3
+
4
+ export function registerAuthRoutes(): void {
5
+ route('/login', LoginPage);
6
+ }
@@ -0,0 +1,63 @@
1
+ import { state } from '@askrjs/askr';
2
+ import { navigate } from '@askrjs/askr/router';
3
+ import { LockKeyholeIcon } from '@askrjs/lucide';
4
+ import { Input } from '@askrjs/ui';
5
+ import {
6
+ Button,
7
+ Container,
8
+ Field,
9
+ FieldHint,
10
+ InputGroup,
11
+ InputGroupText,
12
+ } from '@askrjs/themes/components';
13
+ import {
14
+ Card,
15
+ CardContent,
16
+ CardDescription,
17
+ CardHeader,
18
+ CardTitle,
19
+ } from '@askrjs/themes/components';
20
+ import { Stack } from '@askrjs/themes/components';
21
+
22
+ export default function LoginPage() {
23
+ const [email, setEmail] = state('ops@example.com');
24
+
25
+ return (
26
+ <Container size="sm" class="auth-page">
27
+ <Card variant="raised">
28
+ <CardHeader>
29
+ <span class="card-icon">
30
+ <LockKeyholeIcon size={18} aria-hidden="true" />
31
+ </span>
32
+ <CardTitle>Sign in</CardTitle>
33
+ <CardDescription>
34
+ This starter keeps auth mocked, but the auth shell is isolated from
35
+ the public landing layout and ready for a real session provider.
36
+ </CardDescription>
37
+ </CardHeader>
38
+ <CardContent>
39
+ <Stack gap="4">
40
+ <Field>
41
+ <label htmlFor="email">Work email</label>
42
+ <InputGroup>
43
+ <InputGroupText>@</InputGroupText>
44
+ <Input
45
+ id="email"
46
+ type="email"
47
+ value={email()}
48
+ onInput={(event: Event) =>
49
+ setEmail((event.currentTarget as HTMLInputElement).value)
50
+ }
51
+ />
52
+ </InputGroup>
53
+ <FieldHint>Use any address to enter the demo console.</FieldHint>
54
+ </Field>
55
+ <Button onPress={() => navigate('/app')}>
56
+ Continue to console
57
+ </Button>
58
+ </Stack>
59
+ </CardContent>
60
+ </Card>
61
+ </Container>
62
+ );
63
+ }
@@ -0,0 +1,22 @@
1
+ import { Link } from '@askrjs/askr/router';
2
+ import { Button } from '@askrjs/themes/components';
3
+ import { Container, Section } from '@askrjs/themes/components';
4
+ import { EmptyState } from '@askrjs/themes/components';
5
+
6
+ export default function NotFoundPage() {
7
+ return (
8
+ <Section paddingY="2xl">
9
+ <Container size="sm">
10
+ <EmptyState
11
+ title="Page not found"
12
+ description="The route tree is explicit, so unknown paths fall back here."
13
+ actions={
14
+ <Button asChild>
15
+ <Link href="/">Return home</Link>
16
+ </Button>
17
+ }
18
+ />
19
+ </Container>
20
+ </Section>
21
+ );
22
+ }
@@ -0,0 +1,47 @@
1
+ import { MoonIcon, SunIcon } from '@askrjs/lucide';
2
+ import { Link } from '@askrjs/askr/router';
3
+ import { Button } from '@askrjs/themes/components';
4
+ import { Container, Inline } from '@askrjs/themes/components';
5
+ import { Header } from '@askrjs/themes/components';
6
+ import { NavBrand, NavGroup, Navbar, NavLink } from '@askrjs/themes/components';
7
+ import { ThemeToggle } from '@askrjs/themes/theme';
8
+
9
+ export default function PublicLayout({ children }: { children?: unknown }) {
10
+ return (
11
+ <div class="public-shell">
12
+ <Header position="sticky" class="public-header">
13
+ <Container>
14
+ <Navbar aria-label="Public navigation" breakpoint="md">
15
+ <NavBrand>
16
+ <Link href="/" class="brand-link">
17
+ <span class="brand-mark">A</span>
18
+ <strong>{'{{appName}}'}</strong>
19
+ </Link>
20
+ </NavBrand>
21
+ <NavGroup align="center">
22
+ <NavLink href="/" match="exact">
23
+ Overview
24
+ </NavLink>
25
+ <NavLink href="/login">Sign in</NavLink>
26
+ </NavGroup>
27
+ <NavGroup align="end">
28
+ <Inline gap="2" align="center">
29
+ <ThemeToggle
30
+ variant="ghost"
31
+ size="icon"
32
+ aria-label="Toggle color theme"
33
+ lightIcon={<SunIcon size={18} aria-hidden="true" />}
34
+ darkIcon={<MoonIcon size={18} aria-hidden="true" />}
35
+ />
36
+ <Button asChild>
37
+ <Link href="/login">Open console</Link>
38
+ </Button>
39
+ </Inline>
40
+ </NavGroup>
41
+ </Navbar>
42
+ </Container>
43
+ </Header>
44
+ <main class="public-main">{children}</main>
45
+ </div>
46
+ );
47
+ }
@@ -0,0 +1,6 @@
1
+ import { route } from '@askrjs/askr/router';
2
+ import HomePage from './home';
3
+
4
+ export function registerPublicRoutes(): void {
5
+ route('/', HomePage);
6
+ }
@@ -0,0 +1,143 @@
1
+ import {
2
+ ActivityIcon,
3
+ ArrowRightIcon,
4
+ BotIcon,
5
+ CheckCircle2Icon,
6
+ ShieldCheckIcon,
7
+ } from '@askrjs/lucide';
8
+ import { Link } from '@askrjs/askr/router';
9
+ import { Button } from '@askrjs/themes/components';
10
+ import {
11
+ Badge,
12
+ Card,
13
+ CardContent,
14
+ CardDescription,
15
+ CardHeader,
16
+ CardTitle,
17
+ } from '@askrjs/themes/components';
18
+ import {
19
+ Block,
20
+ Box,
21
+ Container,
22
+ Inline,
23
+ Section,
24
+ Stack,
25
+ } from '@askrjs/themes/components';
26
+ import { EmptyState } from '@askrjs/themes/components';
27
+
28
+ const capabilities = [
29
+ {
30
+ icon: <BotIcon size={16} aria-hidden="true" />,
31
+ title: 'Agent runs',
32
+ description:
33
+ 'Track queued, running, approval, and completed work without collapsing it into one loading state.',
34
+ },
35
+ {
36
+ icon: <ActivityIcon size={16} aria-hidden="true" />,
37
+ title: 'Evented operations',
38
+ description:
39
+ 'Make pending writes, projection lag, and stale read models visible before users need to ask.',
40
+ },
41
+ {
42
+ icon: <ShieldCheckIcon size={16} aria-hidden="true" />,
43
+ title: 'App-ready shell',
44
+ description:
45
+ 'Use route branches, layouts, and theme primitives instead of a one-page demo wrapper.',
46
+ },
47
+ ];
48
+
49
+ export default function HomePage() {
50
+ return (
51
+ <>
52
+ <Section paddingY="2xl">
53
+ <Container size="xl">
54
+ <Block gap="lg" align="center" class="hero-grid">
55
+ <Stack gap="lg" class="hero-copy">
56
+ <Badge>Route-first Askr SPA</Badge>
57
+ <Stack gap="md">
58
+ <h1>Operate agent workflows with a UI that tells the truth.</h1>
59
+ <p class="lead">
60
+ {'{{appName}}'} is a focused Askr console for agentic
61
+ products: public branch, auth branch, app branch, theme
62
+ primitives, consistency-aware states, and no invented layout
63
+ system.
64
+ </p>
65
+ </Stack>
66
+ <Inline gap="3" wrap="wrap">
67
+ <Button asChild>
68
+ <Link href="/login">
69
+ Open console <ArrowRightIcon size={16} aria-hidden="true" />
70
+ </Link>
71
+ </Button>
72
+ <Button variant="secondary" asChild>
73
+ <Link href="/app">View demo dashboard</Link>
74
+ </Button>
75
+ </Inline>
76
+ </Stack>
77
+
78
+ <Card variant="raised" class="hero-card">
79
+ <CardHeader>
80
+ <Inline gap="2" align="center">
81
+ <span class="status-dot" />
82
+ <Badge>Projection current</Badge>
83
+ </Inline>
84
+ <CardTitle>Command center</CardTitle>
85
+ <CardDescription>
86
+ A concise preview of the authenticated shell users see after
87
+ sign-in.
88
+ </CardDescription>
89
+ </CardHeader>
90
+ <CardContent>
91
+ <Stack gap="3">
92
+ <Box class="hero-row" p="3">
93
+ <strong>12 active runs</strong>
94
+ <span>3 need review</span>
95
+ </Box>
96
+ <Box class="hero-row" p="3">
97
+ <strong>98.7% success rate</strong>
98
+ <span>last 24 hours</span>
99
+ </Box>
100
+ <Box class="hero-row" p="3">
101
+ <strong>event id 18,442</strong>
102
+ <span>read model synced</span>
103
+ </Box>
104
+ </Stack>
105
+ </CardContent>
106
+ </Card>
107
+ </Block>
108
+ </Container>
109
+ </Section>
110
+
111
+ <Section paddingY="xl">
112
+ <Container size="xl">
113
+ <Block gap="md" class="feature-grid">
114
+ {capabilities.map((item) => (
115
+ <Card>
116
+ <CardHeader>
117
+ <span class="card-icon">{item.icon}</span>
118
+ <CardTitle>{item.title}</CardTitle>
119
+ <CardDescription>{item.description}</CardDescription>
120
+ </CardHeader>
121
+ </Card>
122
+ ))}
123
+ </Block>
124
+ </Container>
125
+ </Section>
126
+
127
+ <Section paddingY="xl">
128
+ <Container size="lg">
129
+ <EmptyState
130
+ icon={<CheckCircle2Icon size={26} aria-hidden="true" />}
131
+ title="Built from solved primitives"
132
+ description="The page uses Container, Section, Block, Stack, Inline, Box, Card, Badge, Button, Header, Navbar, and EmptyState from @askrjs/themes."
133
+ actions={
134
+ <Button asChild>
135
+ <Link href="/app/agents">Inspect agent runs</Link>
136
+ </Button>
137
+ }
138
+ />
139
+ </Container>
140
+ </Section>
141
+ </>
142
+ );
143
+ }
@@ -0,0 +1,12 @@
1
+ export function formatRelativeTime(value: string): string {
2
+ const date = new Date(value);
3
+ const diffMs = Date.now() - date.getTime();
4
+ const diffMinutes = Math.max(1, Math.round(diffMs / 60000));
5
+
6
+ if (diffMinutes < 60) {
7
+ return `${diffMinutes}m ago`;
8
+ }
9
+
10
+ const diffHours = Math.round(diffMinutes / 60);
11
+ return `${diffHours}h ago`;
12
+ }
@@ -0,0 +1,15 @@
1
+ export const appNavItems = [
2
+ { href: '/app', label: 'Dashboard', icon: 'home', match: 'exact' as const },
3
+ {
4
+ href: '/app/agents',
5
+ label: 'Agent runs',
6
+ icon: 'agents',
7
+ match: 'exact' as const,
8
+ },
9
+ {
10
+ href: '/app/settings',
11
+ label: 'Settings',
12
+ icon: 'settings',
13
+ match: 'exact' as const,
14
+ },
15
+ ] as const;
@@ -0,0 +1,49 @@
1
+ @layer components {
2
+ .brand-link,
3
+ .sidebar-brand {
4
+ display: inline-flex;
5
+ align-items: center;
6
+ gap: var(--ak-space-sm);
7
+ }
8
+
9
+ .brand-mark {
10
+ display: inline-grid;
11
+ place-items: center;
12
+ width: 2rem;
13
+ height: 2rem;
14
+ border-radius: var(--ak-radius-md);
15
+ background: var(--ak-color-primary);
16
+ color: var(--ak-color-primary-contrast);
17
+ font-weight: var(--ak-font-weight-bold);
18
+ }
19
+
20
+ .eyebrow {
21
+ color: var(--ak-color-text-muted);
22
+ font-size: var(--ak-font-size-xs);
23
+ font-weight: var(--ak-font-weight-bold);
24
+ letter-spacing: 0.08em;
25
+ text-transform: uppercase;
26
+ }
27
+
28
+ .lead {
29
+ color: var(--ak-color-text);
30
+ font-size: var(--ak-font-size-lg);
31
+ }
32
+
33
+ .status-dot {
34
+ width: 0.625rem;
35
+ height: 0.625rem;
36
+ border-radius: 999px;
37
+ background: var(--ak-color-success);
38
+ }
39
+
40
+ .card-icon {
41
+ display: inline-grid;
42
+ place-items: center;
43
+ width: 2.25rem;
44
+ height: 2.25rem;
45
+ border-radius: var(--ak-radius-md);
46
+ background: var(--ak-color-primary-soft);
47
+ color: var(--ak-color-primary);
48
+ }
49
+ }