@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,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/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';
@@ -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
- });
@@ -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": "preserve",
16
- "jsxImportSource": "@askrjs/askr"
17
- },
18
- "include": ["src", "tests"],
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": ["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,55 +0,0 @@
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
@@ -1,39 +0,0 @@
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.
@@ -1,17 +0,0 @@
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
- *~
@@ -1,13 +0,0 @@
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>
@@ -1,35 +0,0 @@
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
- }
@@ -1,14 +0,0 @@
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
- }
@@ -1,3 +0,0 @@
1
- export default function Badge({ children }: { children?: unknown }) {
2
- return <span class="badge">{children}</span>;
3
- }
@@ -1,30 +0,0 @@
1
- import { state, derive } from '@askrjs/askr';
2
- import { Button } from '@askrjs/ui';
3
- import { Box, Stack } from '@askrjs/themes/components';
4
- import Badge from './badge';
5
-
6
- export default function Counter() {
7
- const [count, setCount] = state(0);
8
- const parity = derive(() => (count() % 2 === 0 ? 'even' : 'odd'));
9
-
10
- return (
11
- <Box class="card counter">
12
- <Stack gap="3">
13
- <h2>Hydration check</h2>
14
- <p class="text-muted">
15
- This counter should still feel live after static generation.
16
- </p>
17
- <div class="counter-value">{count()}</div>
18
- <div>
19
- <Badge>{parity()}</Badge>
20
- </div>
21
- <div class="counter-controls">
22
- <Button onPress={() => setCount((c) => Math.max(0, c - 1))}>
23
- - Decrement
24
- </Button>
25
- <Button onPress={() => setCount((c) => c + 1)}>+ Increment</Button>
26
- </div>
27
- </Stack>
28
- </Box>
29
- );
30
- }
@@ -1,111 +0,0 @@
1
- import { Link } from '@askrjs/askr/router';
2
- import { Header } from '@askrjs/themes/components';
3
- import {
4
- Block,
5
- Box,
6
- Container,
7
- Section,
8
- Stack,
9
- } from '@askrjs/themes/components';
10
- import { Nav, NavLink } from '@askrjs/themes/components';
11
- import Badge from './badge';
12
-
13
- export const navItems = [
14
- { href: '/', label: 'Home' },
15
- { href: '/workflow', label: 'Workflow' },
16
- { href: '/content', label: 'Content' },
17
- { href: '/preview', label: 'Preview' },
18
- ] as const;
19
-
20
- export function SiteHeader() {
21
- return (
22
- <Header position="sticky">
23
- <Container size="xl" paddingY="md">
24
- <Box class="navbar-shell">
25
- <Box class="navbar-brand">
26
- <Link class="brand" href="/">
27
- <strong>{'{{appName}}'}</strong>
28
- <span>Static site generation sample</span>
29
- </Link>
30
- </Box>
31
-
32
- <Nav
33
- as="div"
34
- aria-label="Primary navigation"
35
- class="navbar-group"
36
- data-align="end"
37
- >
38
- {navItems.map((item) => (
39
- <NavLink href={item.href}>{item.label}</NavLink>
40
- ))}
41
- </Nav>
42
- </Box>
43
- </Container>
44
- </Header>
45
- );
46
- }
47
-
48
- export function PageFrame({ children }: { children?: unknown }) {
49
- return (
50
- <Container size="xl" paddingY="2xl">
51
- <Stack gap="8">{children}</Stack>
52
- </Container>
53
- );
54
- }
55
-
56
- export function SectionHeader({
57
- eyebrow,
58
- title,
59
- description,
60
- actions,
61
- }: {
62
- eyebrow: string;
63
- title: string;
64
- description: string;
65
- actions?: unknown;
66
- }) {
67
- return (
68
- <Section class="section-header" paddingY="xl">
69
- <Block gap="md">
70
- <Stack gap="3" class="section-header-copy">
71
- <Badge>{eyebrow}</Badge>
72
- <h1>{title}</h1>
73
- <p class="section-header-description">{description}</p>
74
- </Stack>
75
-
76
- {actions ?? null}
77
- </Block>
78
- </Section>
79
- );
80
- }
81
-
82
- export function CardGrid({ children }: { children?: unknown }) {
83
- return <Box class="card-grid">{children}</Box>;
84
- }
85
-
86
- export function Card({
87
- eyebrow,
88
- title,
89
- description,
90
- children,
91
- }: {
92
- eyebrow?: string;
93
- title: string;
94
- description?: string;
95
- children?: unknown;
96
- }) {
97
- return (
98
- <Box class="card">
99
- <Stack gap="3">
100
- {eyebrow ? <Badge>{eyebrow}</Badge> : null}
101
- <h2>{title}</h2>
102
- {description ? <p>{description}</p> : null}
103
- {children}
104
- </Stack>
105
- </Box>
106
- );
107
- }
108
-
109
- export function ActionRow({ children }: { children?: unknown }) {
110
- return <Box class="action-row">{children}</Box>;
111
- }
@@ -1,23 +0,0 @@
1
- import type { JSXElement } from '@askrjs/askr/foundations';
2
-
3
- declare global {
4
- namespace JSX {
5
- interface Element extends JSXElement {
6
- readonly __askrSsgJsxElementBrand?: never;
7
- }
8
-
9
- interface IntrinsicElements {
10
- [elem: string]: Record<string, unknown>;
11
- }
12
-
13
- interface ElementAttributesProperty {
14
- props: Record<string, unknown>;
15
- }
16
-
17
- interface ElementChildrenAttribute {
18
- children: unknown;
19
- }
20
- }
21
- }
22
-
23
- export {};
@@ -1,8 +0,0 @@
1
- import './styles.css';
2
- import { createSPA } from '@askrjs/askr/boot';
3
- import { pageRegistry } from './routes';
4
-
5
- await createSPA({
6
- root: document.getElementById('app')!,
7
- registry: pageRegistry,
8
- });