@askrjs/cli 0.0.2 → 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 (310) hide show
  1. package/README.md +46 -7
  2. package/dist/add.d.ts +16 -0
  3. package/dist/add.js +558 -1
  4. package/dist/cli.d.ts +5 -0
  5. package/dist/cli.js +43 -16
  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 +323 -0
  10. package/dist/generate.d.ts +5 -0
  11. package/dist/generate.js +461 -0
  12. package/dist/is-direct-execution-Cdlr-ZUl.js +0 -2
  13. package/dist/openapi.d.ts +25 -0
  14. package/dist/openapi.js +49 -16
  15. package/dist/planner-VAj7qlxr.js +285 -0
  16. package/dist/range-YUs9eimn.js +125 -0
  17. package/dist/registry-CyrRHRG5.js +209 -0
  18. package/dist/skills/askr-dashboard-charts/SKILL.md +61 -44
  19. package/dist/skills/askr-dashboard-charts/agents/openai.yaml +2 -2
  20. package/dist/skills/askr-ssr-ssg/SKILL.md +3 -1
  21. package/dist/{skills-Bh0mEhIx.js → skills-B7CbWur9.js} +89 -26
  22. package/dist/skills.d.ts +18 -0
  23. package/dist/skills.js +1 -1
  24. package/dist/specification-DXnDOC-0.js +49 -0
  25. package/dist/ssg-config.d.ts +41 -0
  26. package/dist/ssg-config.js +1 -0
  27. package/dist/ssg.d.ts +61 -0
  28. package/dist/ssg.js +360 -24
  29. package/dist/templates/full-stack/AGENTS.md +0 -1
  30. package/dist/templates/full-stack/README.md +0 -1
  31. package/dist/templates/full-stack/index.html +0 -1
  32. package/dist/templates/full-stack/package.json +5 -3
  33. package/dist/templates/full-stack/server.ts +5 -9
  34. package/dist/templates/full-stack/src/action-authorizations.ts +2 -2
  35. package/dist/templates/full-stack/src/actions/create-message.ts +5 -5
  36. package/dist/templates/full-stack/src/i18n.ts +4 -4
  37. package/dist/templates/full-stack/src/main.tsx +4 -5
  38. package/dist/templates/full-stack/src/pages/home.tsx +5 -5
  39. package/dist/templates/full-stack/src/pages/layout.tsx +15 -5
  40. package/dist/templates/full-stack/src/pages/not-found.tsx +5 -2
  41. package/dist/templates/full-stack/src/routes.tsx +11 -12
  42. package/dist/templates/full-stack/src/schemas.ts +1 -2
  43. package/dist/templates/full-stack/src/server/action-registry.ts +5 -10
  44. package/dist/templates/full-stack/src/server/actions/create-message.ts +4 -4
  45. package/dist/templates/full-stack/src/server/app.ts +67 -57
  46. package/dist/templates/full-stack/src/server/dependencies.ts +10 -10
  47. package/dist/templates/full-stack/src/server/entry-server.ts +3 -3
  48. package/dist/templates/full-stack/src/telemetry.ts +1 -2
  49. package/dist/templates/full-stack/tests/actions/create-message.test.ts +7 -8
  50. package/dist/templates/full-stack/tsconfig.json +1 -2
  51. package/dist/templates/full-stack/vite.config.ts +5 -6
  52. package/dist/templates/spa/AGENTS.md +1 -1
  53. package/dist/templates/spa/package.json +3 -4
  54. package/dist/templates/spa/src/adapters/operations-client.ts +7 -2
  55. package/dist/templates/spa/src/pages/app/_routes.tsx +2 -0
  56. package/dist/templates/spa/src/pages/app/admin-home.tsx +21 -3
  57. package/dist/templates/spa/src/pages/public/_routes.tsx +2 -0
  58. package/dist/templates/spa/src/styles.css +1 -1
  59. package/dist/templates/spa/tsconfig.json +2 -1
  60. package/dist/templates/spa/vitest.config.ts +0 -4
  61. package/dist/templates/ssg/README.md +1 -1
  62. package/dist/templates/ssg/package.json +1 -1
  63. package/dist/templates/ssg/ssg.config.ts +7 -0
  64. package/dist/templates/ssg/tests/ssg-config.test.ts +5 -3
  65. package/dist/templates/ssg/tsconfig.json +2 -1
  66. package/dist/templates/ssg/vitest.config.ts +0 -4
  67. package/dist/templates/ssr/package.json +2 -2
  68. package/dist/templates/ssr/server.ts +4 -10
  69. package/dist/templates/ssr/src/entry-server.tsx +6 -4
  70. package/dist/templates/startkit/package.json +2 -2
  71. package/dist/templates/startkit/src/lib/mock-data.ts +17 -39
  72. package/dist/templates/startkit/tsconfig.json +2 -1
  73. package/dist/update.d.ts +41 -0
  74. package/dist/update.js +282 -2
  75. package/dist/writer-D8qe_7ud.js +226 -0
  76. package/package.json +23 -22
  77. package/dist/add-DqhqRzBQ.js +0 -555
  78. package/dist/add-DqhqRzBQ.js.map +0 -1
  79. package/dist/cli.js.map +0 -1
  80. package/dist/create.js.map +0 -1
  81. package/dist/is-direct-execution-Cdlr-ZUl.js.map +0 -1
  82. package/dist/openapi.js.map +0 -1
  83. package/dist/skills-Bh0mEhIx.js.map +0 -1
  84. package/dist/ssg.js.map +0 -1
  85. package/dist/templates/full-stack/src/vite-server.d.ts +0 -6
  86. package/dist/templates/spa/src/styles.d.ts +0 -1
  87. package/dist/templates/ssg/src/vite-env.d.ts +0 -5
  88. package/dist/templates/ssr/src/vite-server.d.ts +0 -7
  89. package/dist/templates/startkit/src/vite-env.d.ts +0 -5
  90. package/dist/update-DyW1na5V.js +0 -1140
  91. package/dist/update-DyW1na5V.js.map +0 -1
  92. package/skills/askr-accessibility/SKILL.md +0 -68
  93. package/skills/askr-accessibility/agents/openai.yaml +0 -4
  94. package/skills/askr-agent-execution/SKILL.md +0 -85
  95. package/skills/askr-agent-execution/agents/openai.yaml +0 -4
  96. package/skills/askr-agent-workflows/SKILL.md +0 -57
  97. package/skills/askr-agent-workflows/agents/openai.yaml +0 -4
  98. package/skills/askr-api-integration/SKILL.md +0 -79
  99. package/skills/askr-api-integration/agents/openai.yaml +0 -4
  100. package/skills/askr-app-builder/SKILL.md +0 -99
  101. package/skills/askr-app-builder/agents/openai.yaml +0 -4
  102. package/skills/askr-auth-access/SKILL.md +0 -74
  103. package/skills/askr-auth-access/agents/openai.yaml +0 -4
  104. package/skills/askr-cli-vite/SKILL.md +0 -76
  105. package/skills/askr-cli-vite/agents/openai.yaml +0 -4
  106. package/skills/askr-dashboard-charts/SKILL.md +0 -82
  107. package/skills/askr-dashboard-charts/agents/openai.yaml +0 -4
  108. package/skills/askr-design-system/SKILL.md +0 -86
  109. package/skills/askr-design-system/agents/openai.yaml +0 -4
  110. package/skills/askr-env-config/SKILL.md +0 -74
  111. package/skills/askr-env-config/agents/openai.yaml +0 -4
  112. package/skills/askr-error-loading-empty/SKILL.md +0 -89
  113. package/skills/askr-error-loading-empty/agents/openai.yaml +0 -4
  114. package/skills/askr-file-upload-artifacts/SKILL.md +0 -77
  115. package/skills/askr-file-upload-artifacts/agents/openai.yaml +0 -4
  116. package/skills/askr-forms-tables-crud/SKILL.md +0 -98
  117. package/skills/askr-forms-tables-crud/agents/openai.yaml +0 -4
  118. package/skills/askr-mental-model/SKILL.md +0 -109
  119. package/skills/askr-mental-model/agents/openai.yaml +0 -4
  120. package/skills/askr-migration-react/SKILL.md +0 -81
  121. package/skills/askr-migration-react/agents/openai.yaml +0 -4
  122. package/skills/askr-observability-debugging/SKILL.md +0 -83
  123. package/skills/askr-observability-debugging/agents/openai.yaml +0 -4
  124. package/skills/askr-project-structure/SKILL.md +0 -79
  125. package/skills/askr-project-structure/agents/openai.yaml +0 -4
  126. package/skills/askr-query-mutation/SKILL.md +0 -115
  127. package/skills/askr-query-mutation/agents/openai.yaml +0 -4
  128. package/skills/askr-realtime-streaming/SKILL.md +0 -76
  129. package/skills/askr-realtime-streaming/agents/openai.yaml +0 -4
  130. package/skills/askr-resources-data/SKILL.md +0 -100
  131. package/skills/askr-resources-data/agents/openai.yaml +0 -4
  132. package/skills/askr-routing-layouts/SKILL.md +0 -107
  133. package/skills/askr-routing-layouts/agents/openai.yaml +0 -4
  134. package/skills/askr-runtime-reactivity/SKILL.md +0 -92
  135. package/skills/askr-runtime-reactivity/agents/openai.yaml +0 -4
  136. package/skills/askr-ssr-ssg/SKILL.md +0 -76
  137. package/skills/askr-ssr-ssg/agents/openai.yaml +0 -4
  138. package/skills/askr-testing-determinism/SKILL.md +0 -75
  139. package/skills/askr-testing-determinism/agents/openai.yaml +0 -4
  140. package/skills/askr-theming/SKILL.md +0 -86
  141. package/skills/askr-theming/agents/openai.yaml +0 -4
  142. package/skills/askr-ui-composition/SKILL.md +0 -92
  143. package/skills/askr-ui-composition/agents/openai.yaml +0 -4
  144. package/templates/full-stack/AGENTS.md +0 -12
  145. package/templates/full-stack/README.md +0 -18
  146. package/templates/full-stack/gitignore.template +0 -4
  147. package/templates/full-stack/index.html +0 -14
  148. package/templates/full-stack/package.json +0 -37
  149. package/templates/full-stack/server.ts +0 -13
  150. package/templates/full-stack/src/action-authorizations.ts +0 -10
  151. package/templates/full-stack/src/actions/create-message.ts +0 -10
  152. package/templates/full-stack/src/i18n.ts +0 -8
  153. package/templates/full-stack/src/main.tsx +0 -12
  154. package/templates/full-stack/src/pages/home.tsx +0 -25
  155. package/templates/full-stack/src/pages/layout.tsx +0 -33
  156. package/templates/full-stack/src/pages/not-found.tsx +0 -4
  157. package/templates/full-stack/src/routes.tsx +0 -20
  158. package/templates/full-stack/src/schemas.ts +0 -11
  159. package/templates/full-stack/src/server/action-registry.ts +0 -12
  160. package/templates/full-stack/src/server/actions/create-message.ts +0 -14
  161. package/templates/full-stack/src/server/app.ts +0 -66
  162. package/templates/full-stack/src/server/dependencies.ts +0 -55
  163. package/templates/full-stack/src/server/entry-server.ts +0 -8
  164. package/templates/full-stack/src/telemetry.ts +0 -4
  165. package/templates/full-stack/src/vite-server.d.ts +0 -6
  166. package/templates/full-stack/tests/actions/create-message.test.ts +0 -13
  167. package/templates/full-stack/tsconfig.json +0 -16
  168. package/templates/full-stack/vite.config.ts +0 -11
  169. package/templates/spa/AGENTS.md +0 -60
  170. package/templates/spa/README.md +0 -96
  171. package/templates/spa/gitignore.template +0 -16
  172. package/templates/spa/index.html +0 -13
  173. package/templates/spa/package.json +0 -35
  174. package/templates/spa/src/adapters/operations-client.ts +0 -90
  175. package/templates/spa/src/components/shared/metric-card.tsx +0 -27
  176. package/templates/spa/src/components/shared/status-badge.tsx +0 -24
  177. package/templates/spa/src/features/operations/operations.query.ts +0 -9
  178. package/templates/spa/src/main.tsx +0 -10
  179. package/templates/spa/src/pages/_layout.tsx +0 -9
  180. package/templates/spa/src/pages/_routes.tsx +0 -27
  181. package/templates/spa/src/pages/app/_layout.tsx +0 -94
  182. package/templates/spa/src/pages/app/_routes.tsx +0 -10
  183. package/templates/spa/src/pages/app/admin-home.tsx +0 -152
  184. package/templates/spa/src/pages/app/agent-runs.tsx +0 -93
  185. package/templates/spa/src/pages/app/settings.tsx +0 -91
  186. package/templates/spa/src/pages/auth/_layout.tsx +0 -38
  187. package/templates/spa/src/pages/auth/_routes.tsx +0 -6
  188. package/templates/spa/src/pages/auth/login.tsx +0 -63
  189. package/templates/spa/src/pages/not-found.tsx +0 -22
  190. package/templates/spa/src/pages/public/_layout.tsx +0 -47
  191. package/templates/spa/src/pages/public/_routes.tsx +0 -6
  192. package/templates/spa/src/pages/public/home.tsx +0 -143
  193. package/templates/spa/src/shared/format.ts +0 -12
  194. package/templates/spa/src/shared/navigation.ts +0 -15
  195. package/templates/spa/src/styles/components.css +0 -49
  196. package/templates/spa/src/styles/layout.css +0 -192
  197. package/templates/spa/src/styles/reset.css +0 -44
  198. package/templates/spa/src/styles/theme.css +0 -57
  199. package/templates/spa/src/styles/tokens.css +0 -20
  200. package/templates/spa/src/styles.css +0 -7
  201. package/templates/spa/src/styles.d.ts +0 -1
  202. package/templates/spa/tests/app.test.tsx +0 -37
  203. package/templates/spa/tests/components/shared.test.tsx +0 -12
  204. package/templates/spa/tests/resources.test.ts +0 -22
  205. package/templates/spa/tsconfig.json +0 -20
  206. package/templates/spa/tsconfig.node.json +0 -10
  207. package/templates/spa/vite.config.ts +0 -24
  208. package/templates/spa/vitest.config.ts +0 -17
  209. package/templates/ssg/AGENTS.md +0 -55
  210. package/templates/ssg/README.md +0 -39
  211. package/templates/ssg/gitignore.template +0 -17
  212. package/templates/ssg/index.html +0 -13
  213. package/templates/ssg/package.json +0 -35
  214. package/templates/ssg/src/app.tsx +0 -14
  215. package/templates/ssg/src/components/badge.tsx +0 -3
  216. package/templates/ssg/src/components/counter.tsx +0 -30
  217. package/templates/ssg/src/components/site-shell.tsx +0 -111
  218. package/templates/ssg/src/jsx.d.ts +0 -23
  219. package/templates/ssg/src/main.tsx +0 -8
  220. package/templates/ssg/src/pages/about.tsx +0 -82
  221. package/templates/ssg/src/pages/content.tsx +0 -63
  222. package/templates/ssg/src/pages/example.tsx +0 -97
  223. package/templates/ssg/src/pages/home.tsx +0 -51
  224. package/templates/ssg/src/resources/user.ts +0 -15
  225. package/templates/ssg/src/routes.tsx +0 -15
  226. package/templates/ssg/src/styles.css +0 -89
  227. package/templates/ssg/src/vite-env.d.ts +0 -5
  228. package/templates/ssg/ssg.config.ts +0 -34
  229. package/templates/ssg/tests/app.test.tsx +0 -19
  230. package/templates/ssg/tests/components/counter.test.tsx +0 -18
  231. package/templates/ssg/tests/resources.test.ts +0 -11
  232. package/templates/ssg/tests/ssg-config.test.ts +0 -11
  233. package/templates/ssg/tsconfig.json +0 -20
  234. package/templates/ssg/tsconfig.node.json +0 -10
  235. package/templates/ssg/vite.config.ts +0 -24
  236. package/templates/ssg/vitest.config.ts +0 -17
  237. package/templates/ssr/AGENTS.md +0 -28
  238. package/templates/ssr/README.md +0 -38
  239. package/templates/ssr/gitignore.template +0 -16
  240. package/templates/ssr/index.html +0 -13
  241. package/templates/ssr/package.json +0 -34
  242. package/templates/ssr/server.ts +0 -16
  243. package/templates/ssr/src/app.tsx +0 -21
  244. package/templates/ssr/src/components/counter.tsx +0 -26
  245. package/templates/ssr/src/entry-server.tsx +0 -10
  246. package/templates/ssr/src/main.tsx +0 -11
  247. package/templates/ssr/src/pages/about.tsx +0 -75
  248. package/templates/ssr/src/pages/example.tsx +0 -113
  249. package/templates/ssr/src/pages/home.tsx +0 -56
  250. package/templates/ssr/src/resources/user.ts +0 -15
  251. package/templates/ssr/src/routes.tsx +0 -13
  252. package/templates/ssr/src/styles.css +0 -148
  253. package/templates/ssr/src/vite-server.d.ts +0 -7
  254. package/templates/ssr/tests/app.test.tsx +0 -24
  255. package/templates/ssr/tests/components/counter.test.tsx +0 -13
  256. package/templates/ssr/tests/resources.test.ts +0 -11
  257. package/templates/ssr/tsconfig.json +0 -22
  258. package/templates/ssr/tsconfig.node.json +0 -10
  259. package/templates/ssr/tsconfig.server.json +0 -15
  260. package/templates/ssr/vite.config.ts +0 -25
  261. package/templates/ssr/vitest.config.ts +0 -13
  262. package/templates/startkit/AGENTS.md +0 -77
  263. package/templates/startkit/README.md +0 -192
  264. package/templates/startkit/gitignore.template +0 -16
  265. package/templates/startkit/index.html +0 -13
  266. package/templates/startkit/package.json +0 -35
  267. package/templates/startkit/src/components/app-header.tsx +0 -93
  268. package/templates/startkit/src/components/app-sidebar.tsx +0 -95
  269. package/templates/startkit/src/components/data-table.tsx +0 -80
  270. package/templates/startkit/src/components/empty-state.tsx +0 -13
  271. package/templates/startkit/src/components/page-header.tsx +0 -23
  272. package/templates/startkit/src/components/stat-card.tsx +0 -24
  273. package/templates/startkit/src/features/accounts/account-filters.tsx +0 -61
  274. package/templates/startkit/src/features/accounts/account-table.tsx +0 -79
  275. package/templates/startkit/src/lib/format.ts +0 -31
  276. package/templates/startkit/src/lib/mock-data.ts +0 -441
  277. package/templates/startkit/src/lib/routes.ts +0 -116
  278. package/templates/startkit/src/main.tsx +0 -12
  279. package/templates/startkit/src/pages/_layout.tsx +0 -56
  280. package/templates/startkit/src/pages/auth/_layout.tsx +0 -7
  281. package/templates/startkit/src/pages/auth/login.tsx +0 -129
  282. package/templates/startkit/src/pages/home.tsx +0 -83
  283. package/templates/startkit/src/pages/not-found.tsx +0 -24
  284. package/templates/startkit/src/pages/workspace/_layout.tsx +0 -17
  285. package/templates/startkit/src/pages/workspace/accounts/index.tsx +0 -217
  286. package/templates/startkit/src/pages/workspace/dashboard.tsx +0 -118
  287. package/templates/startkit/src/pages/workspace/settings.tsx +0 -218
  288. package/templates/startkit/src/router.tsx +0 -7
  289. package/templates/startkit/src/routes/auth-config.ts +0 -38
  290. package/templates/startkit/src/routes/auth.ts +0 -8
  291. package/templates/startkit/src/routes/index.ts +0 -28
  292. package/templates/startkit/src/routes/public.ts +0 -8
  293. package/templates/startkit/src/routes/workspace/accounts.ts +0 -8
  294. package/templates/startkit/src/routes/workspace/index.ts +0 -14
  295. package/templates/startkit/src/styles/components.css +0 -396
  296. package/templates/startkit/src/styles/layout.css +0 -192
  297. package/templates/startkit/src/styles/reset.css +0 -38
  298. package/templates/startkit/src/styles/theme.css +0 -76
  299. package/templates/startkit/src/styles/tokens.css +0 -67
  300. package/templates/startkit/src/styles.css +0 -7
  301. package/templates/startkit/src/toast.ts +0 -55
  302. package/templates/startkit/src/utils/join-classes.ts +0 -4
  303. package/templates/startkit/src/vite-env.d.ts +0 -5
  304. package/templates/startkit/tests/app.test.tsx +0 -32
  305. package/templates/startkit/tests/preferences.test.ts +0 -43
  306. package/templates/startkit/tests/resources.test.ts +0 -82
  307. package/templates/startkit/tsconfig.json +0 -20
  308. package/templates/startkit/tsconfig.node.json +0 -10
  309. package/templates/startkit/vite.config.ts +0 -32
  310. package/templates/startkit/vitest.config.ts +0 -13
@@ -1,82 +0,0 @@
1
- import { Link } from '@askrjs/askr/router';
2
- import { Button } from '@askrjs/ui';
3
- import {
4
- ActionRow,
5
- Card,
6
- CardGrid,
7
- SectionHeader,
8
- } from '../components/site-shell';
9
-
10
- const steps = [
11
- {
12
- number: '01',
13
- title: 'Start the dev server',
14
- command: 'npm run dev',
15
- body: 'Vite runs the sample as a SPA while you edit, so page changes feel immediate.',
16
- },
17
- {
18
- number: '02',
19
- title: 'Edit a page',
20
- command: 'src/pages/*.tsx',
21
- body: 'Each page is a plain component. Keep view code, layout, and copy close together.',
22
- },
23
- {
24
- number: '03',
25
- title: 'Keep the route map explicit',
26
- command: 'ssg.config.ts',
27
- body: 'The static route list mirrors the pages the sample site actually ships.',
28
- },
29
- {
30
- number: '04',
31
- title: 'Generate and preview',
32
- command: 'npm run generate && npm run preview',
33
- body: 'Render the site to dist/static and verify the production output before you ship it.',
34
- },
35
- ];
36
-
37
- export default function Workflow() {
38
- return (
39
- <>
40
- <SectionHeader
41
- eyebrow="Workflow"
42
- title="The authoring loop stays short."
43
- description="This sample keeps the daily work obvious: edit a page, update the route map, generate static HTML, and preview the result."
44
- actions={
45
- <ActionRow>
46
- <Button asChild>
47
- <Link href="/content">See the route map</Link>
48
- </Button>
49
- <Button asChild>
50
- <Link href="/preview">Open the preview</Link>
51
- </Button>
52
- </ActionRow>
53
- }
54
- />
55
-
56
- <CardGrid>
57
- {steps.map((step) => (
58
- <Card
59
- eyebrow={step.number}
60
- title={step.title}
61
- description={step.body}
62
- >
63
- <p>
64
- <code>{step.command}</code>
65
- </p>
66
- </Card>
67
- ))}
68
- </CardGrid>
69
-
70
- <Card
71
- title="Why this feels good"
72
- description="There is no hidden router magic. The generated site and the dev server read the same route definitions, so the UI you edit is the UI you ship."
73
- >
74
- <p>
75
- <code>npm run dev</code>, <code>npm run generate</code>, and{' '}
76
- <code>npm run preview</code> are the only commands you need to
77
- remember.
78
- </p>
79
- </Card>
80
- </>
81
- );
82
- }
@@ -1,63 +0,0 @@
1
- import { Link } from '@askrjs/askr/router';
2
- import { Button } from '@askrjs/ui';
3
- import {
4
- ActionRow,
5
- Card,
6
- CardGrid,
7
- SectionHeader,
8
- } from '../components/site-shell';
9
-
10
- const routeMap = [
11
- {
12
- path: '/',
13
- title: 'Home',
14
- note: 'Start here and link out to the rest of the sample.',
15
- },
16
- {
17
- path: '/workflow',
18
- title: 'Workflow',
19
- note: 'Show the edit, generate, and preview loop.',
20
- },
21
- {
22
- path: '/content',
23
- title: 'Content',
24
- note: 'Keep the route list visible and easy to extend.',
25
- },
26
- {
27
- path: '/preview',
28
- title: 'Preview',
29
- note: 'Keep one interactive page to confirm hydration.',
30
- },
31
- ] as const;
32
-
33
- export default function Content() {
34
- return (
35
- <>
36
- <SectionHeader
37
- eyebrow="Content"
38
- title="Four routes, one clear source of truth."
39
- description="Keep the starter small and predictable. Add more routes when the app actually needs them."
40
- actions={
41
- <ActionRow>
42
- <Button asChild>
43
- <Link href="/workflow">Read the workflow</Link>
44
- </Button>
45
- <Button asChild>
46
- <Link href="/preview">Open the preview</Link>
47
- </Button>
48
- </ActionRow>
49
- }
50
- />
51
-
52
- <CardGrid>
53
- {routeMap.map((route) => (
54
- <Card
55
- eyebrow={route.path}
56
- title={route.title}
57
- description={route.note}
58
- />
59
- ))}
60
- </CardGrid>
61
- </>
62
- );
63
- }
@@ -1,97 +0,0 @@
1
- import { state } from '@askrjs/askr';
2
- import { Link } from '@askrjs/askr/router';
3
- import { Button, Input } from '@askrjs/ui';
4
- import Counter from '../components/counter';
5
- import {
6
- ActionRow,
7
- Card,
8
- CardGrid,
9
- SectionHeader,
10
- } from '../components/site-shell';
11
-
12
- const sampleUsers: Record<
13
- number,
14
- { name: string; email: string; note: string }
15
- > = {
16
- 1: {
17
- name: 'User 1',
18
- email: 'user1@example.com',
19
- note: 'Replace this with your own content or connect it to real data later.',
20
- },
21
- 2: {
22
- name: 'User 2',
23
- email: 'user2@example.com',
24
- note: 'This stays simple on purpose so the starter remains easy to delete or extend.',
25
- },
26
- 3: {
27
- name: 'User 3',
28
- email: 'user3@example.com',
29
- note: 'Interactive state still hydrates after static generation without adding async complexity.',
30
- },
31
- };
32
-
33
- export default function Preview() {
34
- const [userId, setUserId] = state(1);
35
- const user = sampleUsers[userId()] ?? {
36
- name: `User ${userId()}`,
37
- email: `user${userId()}@example.com`,
38
- note: 'Use this route as a safe place to try small interactive changes.',
39
- };
40
-
41
- return (
42
- <>
43
- <SectionHeader
44
- eyebrow="Preview"
45
- title="Interactive parts still work after static generation."
46
- description="Keep one page interactive so you can verify hydration, state, and resource loading without turning the template into an app."
47
- actions={
48
- <ActionRow>
49
- <Button asChild>
50
- <Link href="/workflow">Read the workflow</Link>
51
- </Button>
52
- <Button asChild>
53
- <Link href="/content">Review the routes</Link>
54
- </Button>
55
- </ActionRow>
56
- }
57
- />
58
-
59
- <CardGrid>
60
- <Counter />
61
-
62
- <Card
63
- eyebrow="Interactive state"
64
- title="State still hydrates after generation"
65
- description="Change the user id to prove the generated page still responds in the browser."
66
- >
67
- <div class="preview-controls">
68
- <Input
69
- type="number"
70
- min="1"
71
- step="1"
72
- value={String(userId())}
73
- onInput={(event: Event) => {
74
- const nextValue = Number.parseInt(
75
- (event.target as HTMLInputElement).value,
76
- 10
77
- );
78
-
79
- setUserId(Number.isNaN(nextValue) ? 1 : Math.max(1, nextValue));
80
- }}
81
- />
82
- </div>
83
-
84
- <div class="resource-panel">
85
- <div class="resource-status">
86
- <span class="badge">Ready</span>
87
- <span>Hydrated preview</span>
88
- </div>
89
- <h3>{user.name}</h3>
90
- <p>{user.email}</p>
91
- <p class="text-muted">{user.note}</p>
92
- </div>
93
- </Card>
94
- </CardGrid>
95
- </>
96
- );
97
- }
@@ -1,51 +0,0 @@
1
- import { Link } from '@askrjs/askr/router';
2
- import { Button } from '@askrjs/ui';
3
- import {
4
- ActionRow,
5
- Card,
6
- CardGrid,
7
- SectionHeader,
8
- } from '../components/site-shell';
9
-
10
- const highlights = [
11
- {
12
- title: 'Fast feedback',
13
- body: 'Run npm run dev and edit a page to stay in a SPA-style authoring loop.',
14
- },
15
- {
16
- title: 'Deterministic output',
17
- body: 'Keep one explicit route registry in src/routes.tsx so dev and generated output cannot drift.',
18
- },
19
- {
20
- title: 'Hydrated preview',
21
- body: 'Keep one interactive route so you can verify static output and browser behavior together.',
22
- },
23
- ];
24
-
25
- export default function Home() {
26
- return (
27
- <>
28
- <SectionHeader
29
- eyebrow="Static site generation"
30
- title="Build a multi-page site, then ship it as plain HTML."
31
- description="This sample keeps the loop small: author routes, preview in the SPA dev server, generate static files, and inspect the output."
32
- actions={
33
- <ActionRow>
34
- <Button asChild>
35
- <Link href="/workflow">See the workflow</Link>
36
- </Button>
37
- <Button asChild>
38
- <Link href="/preview">Open the preview</Link>
39
- </Button>
40
- </ActionRow>
41
- }
42
- />
43
-
44
- <CardGrid>
45
- {highlights.map((highlight) => (
46
- <Card title={highlight.title} description={highlight.body} />
47
- ))}
48
- </CardGrid>
49
- </>
50
- );
51
- }
@@ -1,15 +0,0 @@
1
- import { resource } from '@askrjs/askr/resources';
2
-
3
- export function fetchUser(id: number) {
4
- return resource(
5
- async ({ signal }: { signal: AbortSignal }) => {
6
- // Simulate API call
7
- await new Promise((resolve) => setTimeout(resolve, 100));
8
- if (signal.aborted) {
9
- throw new DOMException('Request aborted', 'AbortError');
10
- }
11
- return { id, name: `User ${id}`, email: `user${id}@example.com` };
12
- },
13
- [id]
14
- );
15
- }
@@ -1,15 +0,0 @@
1
- import { createRouteRegistry, group, route } from '@askrjs/askr/router';
2
- import AppLayout from './app';
3
- import Home from './pages/home';
4
- import Workflow from './pages/about';
5
- import Content from './pages/content';
6
- import Preview from './pages/example';
7
-
8
- export const pageRegistry = createRouteRegistry(() => {
9
- group({ layout: AppLayout }, () => {
10
- route('/', Home);
11
- route('/workflow', Workflow);
12
- route('/content', Content);
13
- route('/preview', Preview);
14
- });
15
- });
@@ -1,89 +0,0 @@
1
- @import '@askrjs/themes/default';
2
-
3
- * {
4
- box-sizing: border-box;
5
- }
6
-
7
- :root {
8
- color-scheme: light;
9
- }
10
-
11
- body {
12
- margin: 0;
13
- min-height: 100vh;
14
- color: var(--ak-color-fg);
15
- font-family: var(--ak-font-family);
16
- line-height: 1.5;
17
- background: var(--ak-color-bg);
18
- }
19
-
20
- a {
21
- color: inherit;
22
- text-decoration: none;
23
- }
24
-
25
- .site-shell {
26
- min-height: 100vh;
27
- }
28
-
29
- .site-main {
30
- padding-block: clamp(2rem, 4vw, 4rem);
31
- }
32
-
33
- .brand {
34
- display: grid;
35
- gap: 0.15rem;
36
- }
37
-
38
- .brand strong {
39
- font-size: 1.05rem;
40
- letter-spacing: 0.02em;
41
- }
42
-
43
- .brand span {
44
- color: var(--ak-color-text-muted);
45
- font-size: var(--ak-font-size-sm);
46
- }
47
-
48
- .action-row {
49
- display: flex;
50
- flex-wrap: wrap;
51
- gap: var(--ak-space-sm);
52
- }
53
-
54
- .card-grid {
55
- display: grid;
56
- gap: var(--ak-space-lg);
57
- grid-template-columns: repeat(auto-fit, minmax(min(100%, 16rem), 1fr));
58
- }
59
-
60
- .text-muted {
61
- color: var(--ak-color-text-muted);
62
- }
63
-
64
- code {
65
- padding: 0.15em 0.4em;
66
- border-radius: 0.4rem;
67
- background: var(--ak-color-surface-muted);
68
- font-size: 0.9em;
69
- }
70
-
71
- .counter-value {
72
- font-size: clamp(2rem, 4vw, 3.25rem);
73
- font-weight: var(--ak-font-weight-bold);
74
- letter-spacing: -0.05em;
75
- }
76
-
77
- .counter-controls,
78
- .preview-controls,
79
- .resource-status {
80
- display: flex;
81
- flex-wrap: wrap;
82
- gap: var(--ak-space-sm);
83
- align-items: center;
84
- }
85
-
86
- .resource-panel {
87
- display: grid;
88
- gap: var(--ak-space-sm);
89
- }
@@ -1,5 +0,0 @@
1
- declare module '*.css' {
2
- const css: string;
3
-
4
- export default css;
5
- }
@@ -1,34 +0,0 @@
1
- import { readFileSync } from 'node:fs';
2
- import { resolve } from 'node:path';
3
- import type { DocumentRenderArgs } from '@askrjs/askr/ssg';
4
- import { pageRegistry } from './src/routes';
5
-
6
- export const outputDir = './dist';
7
-
8
- let clientTemplate: string | undefined;
9
-
10
- function renderDocument({ appHtml }: DocumentRenderArgs) {
11
- clientTemplate ??= readFileSync(
12
- resolve(process.cwd(), '.askr/client/index.html'),
13
- 'utf8'
14
- );
15
-
16
- const appRoot = /<div([^>]*\bid=["']app["'][^>]*)>\s*<\/div>/i;
17
- if (!appRoot.test(clientTemplate)) {
18
- throw new Error('Built client template must contain an empty #app root.');
19
- }
20
-
21
- return clientTemplate.replace(appRoot, `<div$1>${appHtml}</div>`);
22
- }
23
-
24
- export const staticConfig = {
25
- registry: pageRegistry,
26
- outputDir,
27
- document: renderDocument,
28
- assets: [
29
- {
30
- from: resolve(process.cwd(), '.askr/client/assets'),
31
- to: 'assets',
32
- },
33
- ],
34
- };
@@ -1,19 +0,0 @@
1
- import { describe, expect, it } from 'vite-plus/test';
2
- import { navItems } from '../src/app';
3
-
4
- describe('App shell', () => {
5
- it('exposes the workflow-focused navigation order', () => {
6
- expect(navItems.map((item) => item.label)).toEqual([
7
- 'Home',
8
- 'Workflow',
9
- 'Content',
10
- 'Preview',
11
- ]);
12
- expect(navItems.map((item) => item.href)).toEqual([
13
- '/',
14
- '/workflow',
15
- '/content',
16
- '/preview',
17
- ]);
18
- });
19
- });
@@ -1,18 +0,0 @@
1
- import { describe, it, expect } from 'vite-plus/test';
2
- import { renderToString } from '@askrjs/askr/ssr';
3
- import Counter from '../../src/components/counter';
4
-
5
- describe('Counter', () => {
6
- it('renders the initial hydration check view', () => {
7
- const html = renderToString(() => <Counter />);
8
-
9
- expect(html).toContain('Hydration check');
10
- expect(html).toContain(
11
- 'This counter should still feel live after static generation.'
12
- );
13
- expect(html).toContain('0');
14
- expect(html).toContain('even');
15
- expect(html).toContain('- Decrement');
16
- expect(html).toContain('+ Increment');
17
- });
18
- });
@@ -1,11 +0,0 @@
1
- import { describe, it, expect } from 'vite-plus/test';
2
- import { fetchUser } from '../src/resources/user';
3
-
4
- describe('Resources', () => {
5
- it('creates a resource for fetching user data', () => {
6
- // Resources are called during component render
7
- // Here we just verify the function is defined
8
- expect(fetchUser).toBeDefined();
9
- expect(typeof fetchUser).toBe('function');
10
- });
11
- });
@@ -1,11 +0,0 @@
1
- import { describe, expect, it } from 'vite-plus/test';
2
- import { staticConfig } from '../ssg.config';
3
-
4
- describe('SSG config', () => {
5
- it('keeps the sample route tree explicit', () => {
6
- expect(staticConfig.registry.manifest.records.map((route) => route.path).sort()).toEqual(
7
- ['/', '/content', '/preview', '/workflow'].sort()
8
- );
9
- expect(staticConfig.registry.routes).toHaveLength(4);
10
- });
11
- });
@@ -1,20 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2020",
4
- "useDefineForClassFields": true,
5
- "lib": ["ES2020", "DOM", "DOM.Iterable"],
6
- "module": "ESNext",
7
- "moduleResolution": "bundler",
8
- "skipLibCheck": true,
9
- "esModuleInterop": true,
10
- "allowSyntheticDefaultImports": true,
11
- "strict": true,
12
- "resolveJsonModule": true,
13
- "isolatedModules": true,
14
- "noEmit": true,
15
- "jsx": "react-jsx",
16
- "jsxImportSource": "@askrjs/askr"
17
- },
18
- "include": ["src"],
19
- "references": [{ "path": "./tsconfig.node.json" }]
20
- }
@@ -1,10 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "composite": true,
4
- "skipLibCheck": true,
5
- "module": "ESNext",
6
- "moduleResolution": "bundler",
7
- "allowSyntheticDefaultImports": true
8
- },
9
- "include": ["ssg.config.ts", "vite.config.ts", "vitest.config.ts"]
10
- }
@@ -1,24 +0,0 @@
1
- import { defineConfig } from 'vite-plus';
2
- import { askr } from '@askrjs/vite';
3
-
4
- export default defineConfig({
5
- plugins: [askr()],
6
- lint: {
7
- ignorePatterns: ['dist/**', 'node_modules/**', 'coverage/**'],
8
- },
9
- fmt: {
10
- semi: true,
11
- singleQuote: true,
12
- trailingComma: 'es5',
13
- printWidth: 80,
14
- tabWidth: 2,
15
- },
16
- server: {
17
- port: 5173,
18
- open: true,
19
- },
20
- build: {
21
- outDir: 'dist',
22
- sourcemap: true,
23
- },
24
- });
@@ -1,17 +0,0 @@
1
- import { defineConfig } from 'vite-plus';
2
- import { askr } from '@askrjs/vite';
3
-
4
- export default defineConfig({
5
- plugins: [askr()],
6
- esbuild: {
7
- jsx: 'automatic',
8
- jsxImportSource: '@askrjs/askr',
9
- },
10
- test: {
11
- environment: 'jsdom',
12
- globals: true,
13
- coverage: {
14
- reporter: ['text', 'json', 'html'],
15
- },
16
- },
17
- });
@@ -1,28 +0,0 @@
1
- # {{appName}}
2
-
3
- This is a strict TypeScript, ESM-only Askr SSR application.
4
-
5
- ## Architecture
6
-
7
- - `src/routes.tsx` owns the shared `createRouteRegistry()` result.
8
- - `src/entry-server.tsx` exports a composed `ServerApp` using `@askrjs/server/askr`.
9
- - `index.html` is the only document source and contains exactly one `<!--askr-head-->` marker and one `<!--askr-app-->` marker.
10
- - `@askrjs/vite/server` owns development and production document composition.
11
- - `server.ts` only starts the production app through `@askrjs/node`.
12
- - `src/main.tsx` hydrates server HTML or starts the SPA when no fragment is present.
13
-
14
- Do not add Express, a `render(url)` convention, inline document markup, or manual marker replacement to application code.
15
-
16
- ## Commands
17
-
18
- ```bash
19
- npm run dev
20
- npm run build
21
- npm run preview
22
- npm test
23
- npm run typecheck
24
- npm run lint
25
- npm run fmt
26
- ```
27
-
28
- Use askr-ui primitives for interactive controls, `--ak-*` theme tokens for styling, and preserve the shared server/browser route registry.
@@ -1,38 +0,0 @@
1
- # {{appName}}
2
-
3
- An Askr application with server rendering, browser hydration, and a Node production adapter.
4
-
5
- ## Commands
6
-
7
- ```bash
8
- npm install
9
- npm run dev
10
- npm run build
11
- npm run preview
12
- npm test
13
- ```
14
-
15
- ## Rendering model
16
-
17
- `src/routes.tsx` exports one route registry shared by the browser and server. The server entry composes `createServerApp()` with `createAskrPageHandler()`, which returns an Askr HTML fragment plus normalized document metadata. The Vite server integration preserves static head content, injects Askr-owned metadata at the single `<!--askr-head-->` marker, and inserts the fragment at the single `<!--askr-app-->` marker.
18
-
19
- In development, Vite reloads the server entry and document for each HTML request. The production build emits a document-composing server app; `server.ts` only adapts that Web `ServerApp` to Node transport.
20
-
21
- API responses and other non-fragment responses pass through without document composition.
22
-
23
- ## Structure
24
-
25
- ```text
26
- index.html document source and sole askr-head and askr-app markers
27
- server.ts production Node launcher
28
- src/
29
- main.tsx browser hydration
30
- entry-server.tsx composed ServerApp
31
- routes.tsx shared route registry
32
- app.tsx root layout
33
- pages/ route components
34
- components/ reusable components
35
- resources/ data resources
36
- ```
37
-
38
- The application source does not construct document markup or expose a `render(url)` callback. Document ownership stays in `index.html` and `@askrjs/vite/server`.
@@ -1,16 +0,0 @@
1
- node_modules/
2
- dist/
3
- build/
4
- .env.local
5
- .env.*.local
6
- npm-debug.log*
7
- yarn-debug.log*
8
- yarn-error.log*
9
- pnpm-debug.log*
10
- .DS_Store
11
- Thumbs.db
12
- .vscode/
13
- .idea/
14
- *.swp
15
- *.swo
16
- *~