@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,192 @@
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
+ }
@@ -0,0 +1,44 @@
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
+ }
@@ -0,0 +1,57 @@
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
+ }
@@ -0,0 +1,20 @@
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
+ }
@@ -0,0 +1,7 @@
1
+ @import '@askrjs/themes/default';
2
+ @import '@askrjs/charts/default';
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';
@@ -0,0 +1 @@
1
+ declare module '*.css';
@@ -0,0 +1,37 @@
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
+ });
@@ -0,0 +1,12 @@
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
+ });
@@ -0,0 +1,22 @@
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
+ });
@@ -0,0 +1,20 @@
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": "preserve",
16
+ "jsxImportSource": "@askrjs/askr"
17
+ },
18
+ "include": ["src", "tests"],
19
+ "references": [{ "path": "./tsconfig.node.json" }]
20
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "compilerOptions": {
3
+ "composite": true,
4
+ "skipLibCheck": true,
5
+ "module": "ESNext",
6
+ "moduleResolution": "bundler",
7
+ "allowSyntheticDefaultImports": true
8
+ },
9
+ "include": ["vite.config.ts", "vitest.config.ts"]
10
+ }
@@ -0,0 +1,24 @@
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
+ });
@@ -0,0 +1,17 @@
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
+ });
@@ -0,0 +1,55 @@
1
+ # {{appName}}
2
+
3
+ Static site built with Askr, askr-ui, askr-themes, and the Askr CLI.
4
+
5
+ ## Commands
6
+
7
+ ```bash
8
+ npm run dev # Vite dev server (runs as SPA for development)
9
+ npm run build # Build client assets and atomically publish dist/
10
+ npm run generate # Run full SSG through `askr ssg`
11
+ npm run preview # Serve production build locally
12
+ npm test # Vitest (jsdom)
13
+ npm run typecheck # tsc --noEmit
14
+ npm run lint # vite-plus lint
15
+ npm run fmt # vite-plus format
16
+ ```
17
+
18
+ ## Architecture
19
+
20
+ - **Framework:** Askr - actor-backed, fine-grained reactive UI. No virtual DOM.
21
+ - **Boot flow:** `src/main.tsx` starts the browser app with the shared `pageRegistry`.
22
+ - **SSG flow:** `ssg.config.ts` passes that same registry to the complete executable SSG config. `askr ssg` owns full and incremental generation.
23
+ - **Pages:** `src/pages/home.tsx`, `src/pages/about.tsx`, `src/pages/content.tsx`, and `src/pages/example.tsx` form the sample site.
24
+ - **Shell:** `src/app.tsx` owns the nav and page frame.
25
+ - **Theme primitives:** the starter composes `Header`, `Nav`, `NavLink`, `Container`, `Section`, `Stack`, `Box`, and `Block` from `@askrjs/themes` instead of hand-rolling shell/layout wrappers.
26
+ - **Components:** askr-ui headless components. Props use `onPress` (not `onClick`) and `asChild` for polymorphism.
27
+ - **Styling:** askr-themes CSS via public classes and `data-slot` selectors. Theme import lives in `src/styles.css`.
28
+ - **Routing:** keep `pageRegistry` in `src/routes.tsx` as the single route source of truth for both dev and SSG.
29
+ - **State:** `const [value, setValue] = state(initial)` and `derive()`. Keep starter routes synchronously prerenderable; if you add async data back, provide an SSR-safe strategy before expecting SSG to render it.
30
+ - **Vite plugin:** `askr()` from `@askrjs/vite` handles JSX transform.
31
+
32
+ ## File Structure
33
+
34
+ ```
35
+ ssg.config.ts # Routes, document renderer, and static asset sources
36
+ src/
37
+ main.tsx # Client entry: registers routes and boots createSPA
38
+ app.tsx # Root layout with nav
39
+ routes.tsx # Shared route registration source of truth
40
+ styles.css # Theme import + layout CSS
41
+ components/ # Reusable components
42
+ pages/ # Route page components
43
+ tests/ # Vitest tests
44
+ ```
45
+
46
+ ## Conventions
47
+
48
+ - TypeScript strict mode, ESM-only
49
+ - JSX import source: `@askrjs/askr`
50
+ - Add new pages in `src/pages/`, then update `pageRegistry` in `src/routes.tsx`
51
+ - Pass the shared registry through `ssg.config.ts` instead of maintaining a second hand-written route list
52
+ - Keep SSG execution behind `askr ssg`; do not add a parallel project-local generator
53
+ - Use askr-ui components for interactive elements and askr-themes layout/shell primitives for structure
54
+ - Style with `--ak-*` tokens
55
+ - Keep SSG routes synchronous at render time unless you intentionally wire SSR data into generation
@@ -0,0 +1,39 @@
1
+ # {{appName}}
2
+
3
+ Static site built with [Askr](https://github.com/askrjs/askr).
4
+
5
+ ## Development workflow
6
+
7
+ The starter keeps the authoring loop small and explicit:
8
+
9
+ 1. Run `npm run dev` for the SPA-style editing experience.
10
+ 2. Edit the page components in `src/pages/`.
11
+ 3. Register routes in `src/routes.tsx`.
12
+ 4. Run `npm run build` to build client assets and atomically generate `dist/`.
13
+ 5. Run `npm run preview` to check the production build locally.
14
+
15
+ ## Sample pages
16
+
17
+ - `/` introduces the starter and the basic developer loop.
18
+ - `/workflow` explains the edit, generate, and preview loop.
19
+ - `/content` shows the small explicit route map.
20
+ - `/preview` keeps one interactive page so you can verify hydration.
21
+
22
+ ## Commands
23
+
24
+ ```bash
25
+ npm run dev # Start dev server (runs as SPA)
26
+ npm run build # Build assets and generate the complete static site
27
+ npm run generate # Regenerate static HTML with the Askr CLI
28
+ npm run preview # Preview production build
29
+ npm test # Run tests
30
+ npm run lint # Lint code
31
+ npm run fmt # Format code
32
+ npm run typecheck # Type check
33
+ ```
34
+
35
+ ## Static generation
36
+
37
+ Run `npm run build` to compile browser assets and pre-render every route into `dist/`. The `askr ssg` command owns both full and incremental generation, and publishes routes, metadata, the incremental manifest, and browser assets together.
38
+
39
+ `ssg.config.ts` passes the same immutable route registry used in dev mode, so the shell and leaf pages stay in sync.
@@ -0,0 +1,17 @@
1
+ node_modules/
2
+ dist/
3
+ .askr/client/
4
+ build/
5
+ .env.local
6
+ .env.*.local
7
+ npm-debug.log*
8
+ yarn-debug.log*
9
+ yarn-error.log*
10
+ pnpm-debug.log*
11
+ .DS_Store
12
+ Thumbs.db
13
+ .vscode/
14
+ .idea/
15
+ *.swp
16
+ *.swo
17
+ *~
@@ -0,0 +1,13 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>{{appName}}</title>
8
+ </head>
9
+ <body>
10
+ <div id="app"></div>
11
+ <script type="module" src="/src/main.tsx"></script>
12
+ </body>
13
+ </html>
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "{{appName}}",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "scripts": {
6
+ "dev": "vp dev",
7
+ "build": "npm run build:client && npm run generate",
8
+ "build:client": "vp build --outDir .askr/client",
9
+ "generate": "askr ssg --config ./ssg.config.ts --output ./dist",
10
+ "generate:incremental": "npm run generate -- --incremental",
11
+ "preview": "vp preview",
12
+ "test": "vp test run -c ./vitest.config.ts",
13
+ "typecheck": "tsc --noEmit",
14
+ "lint": "vp lint .",
15
+ "lint:fix": "npm run lint -- --fix",
16
+ "fmt": "vp fmt .",
17
+ "check": "npm run lint && npm run typecheck && npm test && npm run build"
18
+ },
19
+ "dependencies": {
20
+ "@askrjs/askr": ">=0.0.53 <0.1.0",
21
+ "@askrjs/themes": ">=0.0.12 <0.1.0",
22
+ "@askrjs/ui": ">=0.0.13 <0.1.0"
23
+ },
24
+ "devDependencies": {
25
+ "@askrjs/cli": ">=0.0.2 <0.1.0",
26
+ "@askrjs/vite": ">=0.0.6 <0.1.0",
27
+ "@types/node": "^26.0.0",
28
+ "jsdom": "^29.1.1",
29
+ "typescript": "^6.0.3",
30
+ "vite-plus": "^0.2.4"
31
+ },
32
+ "engines": {
33
+ "node": "^20.19.0 || >=22.12.0"
34
+ }
35
+ }
@@ -0,0 +1,14 @@
1
+ import { PageFrame, SiteHeader } from './components/site-shell';
2
+
3
+ export { navItems } from './components/site-shell';
4
+
5
+ export default function App({ children }: { children?: unknown }) {
6
+ return (
7
+ <div class="site-shell">
8
+ <SiteHeader />
9
+ <main class="site-main">
10
+ <PageFrame>{children}</PageFrame>
11
+ </main>
12
+ </div>
13
+ );
14
+ }
@@ -0,0 +1,3 @@
1
+ export default function Badge({ children }: { children?: unknown }) {
2
+ return <span class="badge">{children}</span>;
3
+ }