@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,47 +0,0 @@
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
- }
@@ -1,6 +0,0 @@
1
- import { route } from '@askrjs/askr/router';
2
- import HomePage from './home';
3
-
4
- export function registerPublicRoutes(): void {
5
- route('/', HomePage);
6
- }
@@ -1,143 +0,0 @@
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
- }
@@ -1,12 +0,0 @@
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
- }
@@ -1,15 +0,0 @@
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;
@@ -1,49 +0,0 @@
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
- }
@@ -1,192 +0,0 @@
1
- @layer layout {
2
- .app-root {
3
- min-block-size: 100dvh;
4
- background: var(--spa-surface-glow), var(--ak-color-bg);
5
- }
6
-
7
- .public-shell,
8
- .auth-shell,
9
- .app-shell {
10
- min-block-size: 100dvh;
11
- }
12
-
13
- .public-shell,
14
- .auth-shell {
15
- display: grid;
16
- grid-template-rows: auto 1fr;
17
- }
18
-
19
- .public-header,
20
- .auth-header,
21
- .app-header {
22
- position: sticky;
23
- z-index: 20;
24
- top: 0;
25
- border-bottom: 1px solid var(--ak-color-border-subtle);
26
- background: var(--spa-header-backdrop);
27
- backdrop-filter: blur(14px);
28
- }
29
-
30
- .public-main,
31
- .auth-main,
32
- .app-main {
33
- min-width: 0;
34
- }
35
-
36
- .public-main {
37
- inline-size: min(100%, var(--spa-shell-max-width));
38
- margin-inline: auto;
39
- padding: var(--ak-space-xl) var(--spa-shell-gutter) var(--ak-space-2xl);
40
- }
41
-
42
- .auth-main {
43
- display: grid;
44
- place-items: center;
45
- padding: var(--ak-space-xl) var(--spa-shell-gutter);
46
- }
47
-
48
- .auth-page {
49
- inline-size: min(100%, var(--spa-auth-card-width));
50
- }
51
-
52
- .page-heading {
53
- display: flex;
54
- gap: var(--ak-space-md);
55
- align-items: flex-start;
56
- justify-content: space-between;
57
- }
58
-
59
- .hero-grid,
60
- .operations-grid,
61
- .settings-grid {
62
- display: grid;
63
- grid-template-columns: minmax(0, 1.16fr) minmax(20rem, 0.84fr);
64
- gap: clamp(1rem, 0.7rem + 1.5vw, 2rem);
65
- align-items: start;
66
- }
67
-
68
- .feature-grid,
69
- .metric-grid,
70
- .agent-grid {
71
- display: grid;
72
- grid-template-columns: repeat(3, minmax(0, 1fr));
73
- gap: var(--ak-space-md);
74
- }
75
-
76
- .chart-grid {
77
- display: grid;
78
- grid-template-columns: minmax(0, 1fr) minmax(18rem, 0.72fr);
79
- gap: var(--ak-space-md);
80
- }
81
-
82
- .hero-copy {
83
- max-inline-size: 48rem;
84
- }
85
-
86
- .hero-card {
87
- width: 100%;
88
- }
89
-
90
- .hero-row {
91
- display: flex;
92
- gap: var(--ak-space-md);
93
- align-items: center;
94
- justify-content: space-between;
95
- border: 1px solid var(--ak-color-border-subtle);
96
- border-radius: var(--ak-radius-md);
97
- background: var(--ak-color-surface-muted);
98
- }
99
-
100
- .hero-row span {
101
- color: var(--ak-color-text-muted);
102
- }
103
-
104
- .run-table {
105
- width: 100%;
106
- border-collapse: collapse;
107
- font-size: var(--ak-font-size-sm);
108
- }
109
-
110
- .run-table th,
111
- .run-table td {
112
- padding: 0.75rem 0.5rem;
113
- border-bottom: 1px solid var(--ak-color-border-subtle);
114
- text-align: left;
115
- vertical-align: top;
116
- }
117
-
118
- .run-table th {
119
- color: var(--ak-color-text-muted);
120
- font-size: var(--ak-font-size-xs);
121
- font-weight: var(--ak-font-weight-bold);
122
- letter-spacing: 0.04em;
123
- text-transform: uppercase;
124
- }
125
-
126
- .run-table td:last-child,
127
- .run-table th:last-child {
128
- text-align: right;
129
- }
130
-
131
- .run-table-wrap {
132
- min-width: 0;
133
- }
134
-
135
- .timeline {
136
- display: grid;
137
- gap: var(--ak-space-md);
138
- }
139
-
140
- .timeline-item {
141
- display: grid;
142
- grid-template-columns: auto minmax(0, 1fr);
143
- gap: var(--ak-space-md);
144
- }
145
-
146
- .timeline-dot {
147
- display: grid;
148
- place-items: center;
149
- width: 2rem;
150
- height: 2rem;
151
- border-radius: 999px;
152
- background: var(--ak-color-surface-muted);
153
- color: var(--ak-color-primary);
154
- }
155
-
156
- @media (max-width: 64rem) {
157
- .hero-grid,
158
- .operations-grid,
159
- .settings-grid,
160
- .chart-grid {
161
- grid-template-columns: 1fr;
162
- }
163
-
164
- .feature-grid,
165
- .metric-grid,
166
- .agent-grid {
167
- grid-template-columns: repeat(2, minmax(0, 1fr));
168
- }
169
- }
170
-
171
- @media (max-width: 42rem) {
172
- .feature-grid,
173
- .metric-grid,
174
- .agent-grid {
175
- grid-template-columns: 1fr;
176
- }
177
-
178
- .run-table {
179
- min-width: 42rem;
180
- }
181
-
182
- .run-table-wrap {
183
- overflow-x: auto;
184
- }
185
-
186
- .page-heading,
187
- .hero-row {
188
- align-items: stretch;
189
- flex-direction: column;
190
- }
191
- }
192
- }
@@ -1,44 +0,0 @@
1
- @layer reset {
2
- *,
3
- *::before,
4
- *::after {
5
- box-sizing: border-box;
6
- }
7
-
8
- html,
9
- body,
10
- #app {
11
- margin: 0;
12
- min-height: 100%;
13
- }
14
-
15
- body {
16
- min-block-size: 100dvh;
17
- text-rendering: optimizeLegibility;
18
- -webkit-font-smoothing: antialiased;
19
- }
20
-
21
- button,
22
- input,
23
- select,
24
- textarea {
25
- font: inherit;
26
- }
27
-
28
- a {
29
- color: inherit;
30
- text-decoration: none;
31
- }
32
-
33
- h1,
34
- h2,
35
- h3,
36
- p {
37
- margin: 0;
38
- }
39
-
40
- svg {
41
- display: block;
42
- flex: 0 0 auto;
43
- }
44
- }
@@ -1,57 +0,0 @@
1
- @layer theme {
2
- body {
3
- background:
4
- radial-gradient(
5
- 1100px 620px at 100% -12%,
6
- color-mix(in srgb, var(--ak-color-primary) 13%, transparent),
7
- transparent 60%
8
- ),
9
- radial-gradient(
10
- 820px 420px at -8% 14%,
11
- color-mix(in srgb, var(--ak-color-primary) 8%, transparent),
12
- transparent 64%
13
- ),
14
- var(--ak-color-bg);
15
- color: var(--ak-color-fg);
16
- font-family: var(--ak-font-family);
17
- font-size: var(--ak-font-size-md);
18
- line-height: 1.55;
19
- }
20
-
21
- h1 {
22
- font-size: var(--ak-font-size-display);
23
- line-height: 1.06;
24
- letter-spacing: -0.03em;
25
- text-wrap: balance;
26
- }
27
-
28
- h2 {
29
- font-size: var(--ak-font-size-heading);
30
- line-height: 1.3;
31
- letter-spacing: -0.015em;
32
- text-wrap: balance;
33
- }
34
-
35
- .lead,
36
- .muted,
37
- p {
38
- color: var(--ak-color-muted);
39
- line-height: 1.65;
40
- }
41
-
42
- ::selection {
43
- background: color-mix(in srgb, var(--ak-color-primary) 30%, transparent);
44
- color: var(--ak-color-fg);
45
- }
46
-
47
- @media (prefers-reduced-motion: reduce) {
48
- *,
49
- *::before,
50
- *::after {
51
- animation-duration: 0.01ms !important;
52
- animation-iteration-count: 1 !important;
53
- transition-duration: 0.01ms !important;
54
- scroll-behavior: auto !important;
55
- }
56
- }
57
- }
@@ -1,20 +0,0 @@
1
- @layer tokens {
2
- :root {
3
- --spa-shell-gutter: clamp(var(--ak-space-lg), 2vw, var(--ak-space-xl));
4
- --spa-shell-max-width: min(
5
- var(--ak-layout-content-max-width),
6
- calc(100% - 2 * var(--spa-shell-gutter))
7
- );
8
- --spa-auth-card-width: min(100%, 28rem);
9
- --spa-header-backdrop: color-mix(
10
- in srgb,
11
- var(--ak-color-bg) 92%,
12
- transparent
13
- );
14
- --spa-surface-glow: linear-gradient(
15
- 180deg,
16
- color-mix(in srgb, var(--ak-color-surface-muted) 58%, transparent),
17
- transparent 22rem
18
- );
19
- }
20
- }
@@ -1,7 +0,0 @@
1
- @import '@askrjs/themes/default';
2
- @import '@askrjs/charts/styles';
3
- @import './styles/reset.css';
4
- @import './styles/tokens.css';
5
- @import './styles/theme.css';
6
- @import './styles/layout.css';
7
- @import './styles/components.css';
@@ -1 +0,0 @@
1
- declare module '*.css';
@@ -1,37 +0,0 @@
1
- import { describe, expect, it } from 'vite-plus/test';
2
-
3
- describe('SPA template structure', () => {
4
- it('documents the route-first shell and theme layers the app should keep', () => {
5
- const structure = [
6
- 'src/main.tsx',
7
- 'src/pages/_routes.tsx',
8
- 'src/pages/_layout.tsx',
9
- 'src/pages/public/_routes.tsx',
10
- 'src/pages/public/_layout.tsx',
11
- 'src/pages/public/home.tsx',
12
- 'src/pages/auth/_routes.tsx',
13
- 'src/pages/auth/_layout.tsx',
14
- 'src/pages/auth/login.tsx',
15
- 'src/pages/app/_routes.tsx',
16
- 'src/pages/app/_layout.tsx',
17
- 'src/pages/app/admin-home.tsx',
18
- 'src/styles.css',
19
- 'src/styles/reset.css',
20
- 'src/styles/tokens.css',
21
- 'src/styles/theme.css',
22
- 'src/styles/layout.css',
23
- 'src/styles/components.css',
24
- 'src/features/operations/operations.query.ts',
25
- 'src/adapters/operations-client.ts',
26
- 'src/components/shared/metric-card.tsx',
27
- ];
28
-
29
- expect(structure).toContain('src/pages/_routes.tsx');
30
- expect(structure).toContain('src/pages/app/_layout.tsx');
31
- expect(structure).toContain('src/pages/auth/_layout.tsx');
32
- expect(structure).toContain('src/styles/tokens.css');
33
- expect(structure).toContain('src/styles/layout.css');
34
- expect(structure).toContain('src/features/operations/operations.query.ts');
35
- expect(structure).toContain('src/adapters/operations-client.ts');
36
- });
37
- });
@@ -1,12 +0,0 @@
1
- import { describe, expect, it } from 'vite-plus/test';
2
- import MetricCard from '../../src/components/shared/metric-card';
3
- import StatusBadge from '../../src/components/shared/status-badge';
4
-
5
- describe('shared app components', () => {
6
- it('exports small app-local wrappers around theme primitives', () => {
7
- expect(MetricCard).toBeDefined();
8
- expect(StatusBadge).toBeDefined();
9
- expect(typeof MetricCard).toBe('function');
10
- expect(typeof StatusBadge).toBe('function');
11
- });
12
- });
@@ -1,22 +0,0 @@
1
- import { describe, expect, it } from 'vite-plus/test';
2
- import { getOperationsSnapshot } from '../src/adapters/operations-client';
3
- import { loadOperations } from '../src/features/operations/operations.query';
4
-
5
- describe('operations data flow', () => {
6
- it('loads the dashboard snapshot through the feature query boundary', async () => {
7
- const snapshot = await loadOperations({});
8
-
9
- expect(snapshot.metrics.length).toBeGreaterThan(0);
10
- expect(snapshot.runs.length).toBeGreaterThan(0);
11
- expect(snapshot.lastEventId).toMatch(/^evt_/);
12
- });
13
-
14
- it('keeps cancellation owned by the adapter', async () => {
15
- const controller = new AbortController();
16
- const request = getOperationsSnapshot({ signal: controller.signal });
17
-
18
- controller.abort();
19
-
20
- await expect(request).rejects.toThrow(/aborted/i);
21
- });
22
- });