@h-ai/cli 0.1.0-alpha.20 → 0.1.0-alpha.21

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 (181) hide show
  1. package/README.md +10 -7
  2. package/dist/{chunk-GSMXGUYF.js → chunk-5IGMJVV5.js} +56 -38
  3. package/dist/chunk-5IGMJVV5.js.map +1 -0
  4. package/dist/{chunk-3BBXDQ4Y.js → chunk-CFCXOKGV.js} +24 -2
  5. package/dist/chunk-CFCXOKGV.js.map +1 -0
  6. package/dist/cli-config-templates-5J5VKWWD.js +5 -0
  7. package/dist/{cli-config-templates-IGGO7P45.js.map → cli-config-templates-5J5VKWWD.js.map} +1 -1
  8. package/dist/cli-skill-templates-JMSV2SVW.js +5 -0
  9. package/dist/{cli-skill-templates-IMYZPQRG.js.map → cli-skill-templates-JMSV2SVW.js.map} +1 -1
  10. package/dist/index.js +567 -75
  11. package/dist/index.js.map +1 -1
  12. package/package.json +3 -2
  13. package/templates/README.md +40 -29
  14. package/templates/apps/api/apps/{{projectName}}-contract/README.md.hbs +16 -0
  15. package/templates/apps/api/apps/{{projectName}}-contract/package.json.hbs +38 -0
  16. package/templates/apps/api/apps/{{projectName}}-contract/src/app-contract.ts.hbs +27 -0
  17. package/templates/apps/api/apps/{{projectName}}-contract/src/app-schemas.ts.hbs +33 -0
  18. package/templates/apps/api/apps/{{projectName}}-contract/src/index.ts.hbs +3 -0
  19. package/templates/apps/api/apps/{{projectName}}-contract/src/{{projectName}}-contract.ts.hbs +12 -0
  20. package/templates/apps/api/apps/{{projectName}}-contract/tests/contract.test.ts.hbs +18 -0
  21. package/templates/apps/api/apps/{{projectName}}-contract/tsconfig.json.hbs +12 -0
  22. package/templates/apps/api/apps/{{projectName}}-contract/tsup.config.ts.hbs +11 -0
  23. package/templates/apps/api/apps/{{projectName}}-contract/vitest.config.ts.hbs +9 -0
  24. package/templates/apps/api/apps/{{projectName}}-service/README.md.hbs +17 -0
  25. package/templates/apps/api/apps/{{projectName}}-service/config/_core.yml.hbs +19 -0
  26. package/templates/apps/api/apps/{{projectName}}-service/config/_serv.yml.hbs +26 -0
  27. package/templates/apps/api/apps/{{projectName}}-service/package.json.hbs +55 -0
  28. package/templates/apps/api/apps/{{projectName}}-service/src/app.ts.hbs +98 -0
  29. package/templates/apps/api/apps/{{projectName}}-service/src/index.ts.hbs +21 -0
  30. package/templates/apps/api/apps/{{projectName}}-service/src/lib/server/init.ts.hbs +184 -0
  31. package/templates/apps/api/apps/{{projectName}}-service/src/server/procedures/app-procedures.ts.hbs +49 -0
  32. package/templates/apps/api/apps/{{projectName}}-service/src/server/procedures/index.ts.hbs +18 -0
  33. package/templates/apps/api/apps/{{projectName}}-service/tests/service.test.ts.hbs +168 -0
  34. package/templates/apps/api/apps/{{projectName}}-service/tsconfig.json.hbs +16 -0
  35. package/templates/apps/api/apps/{{projectName}}-service/tsup.config.ts.hbs +11 -0
  36. package/templates/apps/api/apps/{{projectName}}-service/vitest.config.ts.hbs +9 -0
  37. package/templates/apps/api/e2e/api-service.spec.ts.hbs +18 -0
  38. package/templates/apps/api/eslint.config.js +32 -0
  39. package/templates/apps/api/package.json.hbs +29 -0
  40. package/templates/apps/api/playwright.config.ts.hbs +58 -0
  41. package/templates/apps/api/pnpm-workspace.yaml.hbs +14 -0
  42. package/templates/apps/api/tsconfig.base.json +15 -0
  43. package/templates/apps/fullstack/apps/{{projectName}}-app/.env.example.hbs +10 -0
  44. package/templates/apps/fullstack/apps/{{projectName}}-app/README.md.hbs +24 -7
  45. package/templates/apps/fullstack/apps/{{projectName}}-app/capacitor.config.ts.hbs +18 -0
  46. package/templates/apps/fullstack/apps/{{projectName}}-app/eslint.config.js.hbs +1 -1
  47. package/templates/apps/fullstack/apps/{{projectName}}-app/index.html.hbs +16 -0
  48. package/templates/apps/fullstack/apps/{{projectName}}-app/messages/en-US.json.hbs +6 -0
  49. package/templates/apps/fullstack/apps/{{projectName}}-app/messages/zh-CN.json.hbs +6 -0
  50. package/templates/apps/fullstack/apps/{{projectName}}-app/package.json.hbs +51 -29
  51. package/templates/apps/fullstack/apps/{{projectName}}-app/src/App.svelte.hbs +186 -0
  52. package/templates/apps/fullstack/apps/{{projectName}}-app/src/app.css.hbs +2 -0
  53. package/templates/apps/fullstack/apps/{{projectName}}-app/src/app.d.ts.hbs +0 -1
  54. package/templates/apps/fullstack/apps/{{projectName}}-app/src/lib/capacitor.ts.hbs +18 -0
  55. package/templates/apps/fullstack/apps/{{projectName}}-app/src/main.ts.hbs +14 -0
  56. package/templates/apps/fullstack/apps/{{projectName}}-app/svelte.config.js.hbs +1 -5
  57. package/templates/apps/fullstack/apps/{{projectName}}-app/tsconfig.json.hbs +10 -4
  58. package/templates/apps/fullstack/apps/{{projectName}}-app/vite.config.ts.hbs +4 -3
  59. package/templates/apps/fullstack/apps/{{projectName}}-desktop/.env.example.hbs +6 -0
  60. package/templates/apps/fullstack/apps/{{projectName}}-desktop/README.md.hbs +20 -6
  61. package/templates/apps/fullstack/apps/{{projectName}}-desktop/eslint.config.js.hbs +1 -1
  62. package/templates/apps/fullstack/apps/{{projectName}}-desktop/index.html.hbs +15 -0
  63. package/templates/apps/fullstack/apps/{{projectName}}-desktop/package.json.hbs +33 -30
  64. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/App.svelte.hbs +152 -0
  65. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/app.d.ts.hbs +1 -2
  66. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/main.ts.hbs +13 -0
  67. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/Cargo.toml.hbs +22 -0
  68. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/build.rs.hbs +6 -0
  69. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/capabilities/default.json.hbs +12 -0
  70. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/128x128.png +0 -0
  71. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/128x128@2x.png +0 -0
  72. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/32x32.png +0 -0
  73. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/icon.icns +0 -0
  74. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/icon.ico +0 -0
  75. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/src/lib.rs.hbs +16 -0
  76. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/src/main.rs.hbs +8 -0
  77. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/tauri.conf.json.hbs +41 -0
  78. package/templates/apps/fullstack/apps/{{projectName}}-desktop/svelte.config.js.hbs +2 -8
  79. package/templates/apps/fullstack/apps/{{projectName}}-desktop/tsconfig.json.hbs +9 -4
  80. package/templates/apps/fullstack/apps/{{projectName}}-desktop/vite.config.ts.hbs +44 -21
  81. package/templates/apps/fullstack/apps/{{projectName}}-web/README.md.hbs +15 -6
  82. package/templates/apps/fullstack/apps/{{projectName}}-web/eslint.config.js.hbs +1 -1
  83. package/templates/apps/fullstack/apps/{{projectName}}-web/index.html.hbs +15 -0
  84. package/templates/apps/fullstack/apps/{{projectName}}-web/package.json.hbs +25 -27
  85. package/templates/apps/fullstack/apps/{{projectName}}-web/src/App.svelte.hbs +153 -0
  86. package/templates/apps/fullstack/apps/{{projectName}}-web/src/app.d.ts.hbs +0 -1
  87. package/templates/apps/fullstack/apps/{{projectName}}-web/src/main.ts.hbs +14 -0
  88. package/templates/apps/fullstack/apps/{{projectName}}-web/svelte.config.js.hbs +1 -5
  89. package/templates/apps/fullstack/apps/{{projectName}}-web/tsconfig.json.hbs +10 -4
  90. package/templates/apps/fullstack/apps/{{projectName}}-web/vite.config.ts.hbs +3 -2
  91. package/templates/apps/fullstack/e2e/fullstack.spec.ts.hbs +2 -1
  92. package/templates/apps/fullstack/eslint.config.js +0 -1
  93. package/templates/apps/fullstack/package.json.hbs +18 -17
  94. package/templates/apps/fullstack/packages/{{projectName}}-contract/package.json.hbs +3 -3
  95. package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +2 -2
  96. package/templates/apps/fullstack/packages/{{projectName}}-serv/package.json.hbs +2 -2
  97. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/index.ts.hbs +1 -1
  98. package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/{server-app.test.ts.hbs → app-server.test.ts.hbs} +1 -1
  99. package/templates/apps/fullstack/packages/{{projectName}}-shared/package.json.hbs +9 -8
  100. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/index.ts.hbs +1 -1
  101. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/api-client.ts.hbs +5 -1
  102. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/ThemeSwitcher.svelte.hbs +1 -1
  103. package/templates/apps/fullstack/packages/{{projectName}}-shared/tsconfig.json.hbs +1 -1
  104. package/templates/apps/fullstack/playwright.config.ts.hbs +41 -4
  105. package/templates/apps/fullstack/pnpm-workspace.yaml.hbs +15 -0
  106. package/templates/apps/mobile-app/.env.hbs +3 -0
  107. package/templates/apps/{android-app → mobile-app}/capacitor.config.ts.hbs +2 -2
  108. package/templates/apps/mobile-app/index.html.hbs +13 -0
  109. package/templates/apps/mobile-app/messages/en-US.json +36 -0
  110. package/templates/apps/mobile-app/messages/zh-CN.json +36 -0
  111. package/templates/apps/mobile-app/src/App.svelte.hbs +162 -0
  112. package/templates/apps/mobile-app/src/lib/api.ts.hbs +54 -0
  113. package/templates/apps/{android-app → mobile-app}/src/lib/capacitor.ts +5 -6
  114. package/templates/apps/mobile-app/src/main.ts.hbs +11 -0
  115. package/templates/base/.gitignore.hbs +16 -0
  116. package/templates/base/{eslint.config.js → eslint.config.js.hbs} +4 -1
  117. package/templates/base/package.json.hbs +52 -33
  118. package/templates/base/playwright.config.ts +30 -3
  119. package/templates/base/pnpm-workspace.yaml.hbs +14 -0
  120. package/templates/base/src/app.d.ts.hbs +3 -0
  121. package/templates/base/src/app.html.hbs +3 -0
  122. package/templates/base/svelte.config.js.hbs +43 -3
  123. package/templates/base/tests/scaffold.test.ts.hbs +7 -0
  124. package/templates/base/tsconfig.json.hbs +50 -0
  125. package/templates/base/vite.config.ts.hbs +10 -0
  126. package/templates/skills/AGENTS.md +57 -24
  127. package/templates/skills/CLAUDE.md +18 -7
  128. package/templates/skills/bridges/admin/AGENTS.md +66 -0
  129. package/templates/skills/bridges/admin/CLAUDE.md +19 -0
  130. package/templates/skills/bridges/admin/copilot-instructions.md +46 -0
  131. package/templates/skills/bridges/api/AGENTS.md +65 -0
  132. package/templates/skills/bridges/api/CLAUDE.md +19 -0
  133. package/templates/skills/bridges/api/copilot-instructions.md +46 -0
  134. package/templates/skills/bridges/fullstack/AGENTS.md +84 -0
  135. package/templates/skills/bridges/fullstack/CLAUDE.md +19 -0
  136. package/templates/skills/bridges/fullstack/copilot-instructions.md +54 -0
  137. package/templates/skills/bridges/h5/AGENTS.md +65 -0
  138. package/templates/skills/bridges/h5/CLAUDE.md +19 -0
  139. package/templates/skills/bridges/h5/copilot-instructions.md +44 -0
  140. package/templates/skills/bridges/mobile-app/AGENTS.md +77 -0
  141. package/templates/skills/bridges/mobile-app/CLAUDE.md +19 -0
  142. package/templates/skills/bridges/mobile-app/copilot-instructions.md +45 -0
  143. package/templates/skills/bridges/website/AGENTS.md +65 -0
  144. package/templates/skills/bridges/website/CLAUDE.md +19 -0
  145. package/templates/skills/bridges/website/copilot-instructions.md +44 -0
  146. package/templates/skills/copilot-instructions.md +27 -64
  147. package/templates/skills/hai-app-create/SKILL.md +1 -0
  148. package/templates/skills/hai-app-review/SKILL.md +1 -1
  149. package/templates/skills/hai-app-tests/SKILL.md +28 -3
  150. package/templates/skills/hai-capacitor/SKILL.md +14 -22
  151. package/templates/skills/opencode.json +1 -6
  152. package/dist/chunk-3BBXDQ4Y.js.map +0 -1
  153. package/dist/chunk-GSMXGUYF.js.map +0 -1
  154. package/dist/cli-config-templates-IGGO7P45.js +0 -5
  155. package/dist/cli-skill-templates-IMYZPQRG.js +0 -5
  156. package/templates/apps/android-app/.env.hbs +0 -3
  157. package/templates/apps/android-app/messages/en-US.json +0 -24
  158. package/templates/apps/android-app/messages/zh-CN.json +0 -24
  159. package/templates/apps/android-app/src/lib/api.ts.hbs +0 -32
  160. package/templates/apps/android-app/src/routes/+layout.svelte.hbs +0 -43
  161. package/templates/apps/android-app/src/routes/+layout.ts +0 -7
  162. package/templates/apps/android-app/src/routes/+page.svelte.hbs +0 -38
  163. package/templates/apps/api/src/routes/+layout.svelte +0 -14
  164. package/templates/apps/api/src/routes/+page.svelte +0 -11
  165. package/templates/apps/api/src/routes/api/v1/health/+server.ts +0 -14
  166. package/templates/apps/api/src/routes/api/v1/items/+server.ts +0 -37
  167. package/templates/apps/api/src/routes/api/v1/items/[id]/+server.ts +0 -30
  168. package/templates/apps/api/tests/health.test.ts.hbs +0 -26
  169. package/templates/apps/fullstack/apps/{{projectName}}-app/src/app.html.hbs +0 -14
  170. package/templates/apps/fullstack/apps/{{projectName}}-app/src/routes/+layout.svelte.hbs +0 -18
  171. package/templates/apps/fullstack/apps/{{projectName}}-app/src/routes/+page.svelte.hbs +0 -162
  172. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/app.html.hbs +0 -14
  173. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/routes/+layout.svelte.hbs +0 -18
  174. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/routes/+page.svelte.hbs +0 -162
  175. package/templates/apps/fullstack/apps/{{projectName}}-web/src/app.html.hbs +0 -14
  176. package/templates/apps/fullstack/apps/{{projectName}}-web/src/routes/+layout.svelte.hbs +0 -18
  177. package/templates/apps/fullstack/apps/{{projectName}}-web/src/routes/+page.svelte.hbs +0 -162
  178. package/templates/apps/fullstack/pnpm-workspace.yaml +0 -7
  179. package/templates/base/tsconfig.json +0 -20
  180. /package/templates/apps/fullstack/packages/{{projectName}}-serv/src/{server-app.ts.hbs → app-server.ts.hbs} +0 -0
  181. /package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/{theme.svelte.ts.hbs → theme-store.svelte.ts.hbs} +0 -0
@@ -1,14 +0,0 @@
1
- {{! @skipIfEmpty }}
2
- {{#if fullstack.frontends.desktop}}
3
- <!doctype html>
4
- <html lang="%paraglide.lang%">
5
- <head>
6
- <meta charset="utf-8" />
7
- <meta name="viewport" content="width=device-width, initial-scale=1" />
8
- %sveltekit.head%
9
- </head>
10
- <body data-sveltekit-preload-data="hover">
11
- <div style="display: contents">%sveltekit.body%</div>
12
- </body>
13
- </html>
14
- {{/if}}
@@ -1,18 +0,0 @@
1
- {{! @skipIfEmpty }}
2
- {{#if fullstack.frontends.desktop}}
3
- <script lang="ts">
4
- import { setLocale } from '$lib/paraglide/runtime.js'
5
- import { AppShell } from '{{fullstack.sharedPackageName}}'
6
- import '../app.css'
7
-
8
- const { children } = $props()
9
-
10
- function syncLocale(locale: string) {
11
- setLocale(locale as Parameters<typeof setLocale>[0])
12
- }
13
- </script>
14
-
15
- <AppShell platform="desktop" onLocaleChange={syncLocale}>
16
- {@render children()}
17
- </AppShell>
18
- {{/if}}
@@ -1,162 +0,0 @@
1
- {{! @skipIfEmpty }}
2
- {{#if fullstack.frontends.desktop}}
3
- <script lang="ts">
4
- import type { AppInfo } from '{{fullstack.sharedPackageName}}'
5
- import * as appM from '$lib/paraglide/messages.js'
6
- import { Alert, Button, Card, Skeleton } from '@h-ai/ui'
7
- import { onMount } from 'svelte'
8
- import { fetchAppInfo, messages as sharedM } from '{{fullstack.sharedPackageName}}'
9
-
10
- let info = $state<AppInfo | null>(null)
11
- let loading = $state(true)
12
- let errorMessage = $state('')
13
-
14
- async function refreshStatus() {
15
- loading = true
16
- errorMessage = ''
17
- try {
18
- info = await fetchAppInfo()
19
- }
20
- catch {
21
- info = null
22
- errorMessage = sharedM.home_error()
23
- }
24
- finally {
25
- loading = false
26
- }
27
- }
28
-
29
- onMount(() => {
30
- void refreshStatus()
31
- })
32
- </script>
33
-
34
- <svelte:head>
35
- <title>{appM.page_title({ name: sharedM.app_name() })}</title>
36
- </svelte:head>
37
-
38
- <section class="space-y-8">
39
- <div class="grid gap-6 lg:grid-cols-[1.2fr_0.8fr]">
40
- <section class="relative overflow-hidden rounded-[2rem] border border-base-300/70 bg-gradient-to-br from-primary/15 via-base-100 to-secondary/15 p-6 shadow-2xl shadow-primary/10 lg:p-10">
41
- <div class="absolute right-8 top-8 hidden size-28 rounded-full bg-primary/20 blur-3xl sm:block"></div>
42
- <div class="relative z-10 max-w-2xl space-y-6">
43
- <span class="badge badge-primary badge-lg gap-2">
44
- <span class="icon-[tabler--rocket] size-4"></span>
45
- {appM.hero_badge()}
46
- </span>
47
- <div class="space-y-4">
48
- <h1 class="text-4xl font-black tracking-tight text-base-content sm:text-5xl">
49
- {appM.hero_title({ name: sharedM.app_name() })}
50
- </h1>
51
- <p class="max-w-xl text-lg leading-8 text-base-content/70">
52
- {appM.hero_subtitle()}
53
- </p>
54
- </div>
55
- <div class="flex flex-wrap gap-3">
56
- <a class="btn btn-primary shadow-lg shadow-primary/20" href="#status">
57
- <span class="icon-[tabler--activity-heartbeat] size-5"></span>
58
- {appM.hero_primary_action()}
59
- </a>
60
- <a class="btn btn-ghost" href="#customize">
61
- <span class="icon-[tabler--adjustments] size-5"></span>
62
- {appM.hero_secondary_action()}
63
- </a>
64
- </div>
65
- </div>
66
- </section>
67
-
68
- <aside class="rounded-[2rem] border border-base-300/70 bg-base-100/80 p-5 shadow-xl backdrop-blur">
69
- <div class="mockup-window border border-base-300 bg-base-200/70">
70
- <div class="space-y-4 bg-base-100 p-5">
71
- <div class="flex items-center justify-between">
72
- <div>
73
- <p class="text-sm font-semibold">{appM.preview_title()}</p>
74
- <p class="text-xs text-base-content/55">{appM.preview_body()}</p>
75
- </div>
76
- <span class="badge badge-success badge-outline">{appM.platform_name()}</span>
77
- </div>
78
- <div class="grid gap-3 text-sm">
79
- <div class="rounded-2xl bg-primary/10 p-4">
80
- <span class="icon-[tabler--components] mb-2 size-6 text-primary"></span>
81
- <p class="font-semibold">{appM.preview_metric_shared()}</p>
82
- </div>
83
- <div class="grid grid-cols-2 gap-3">
84
- <div class="rounded-2xl bg-secondary/10 p-4">
85
- <span class="icon-[tabler--language] mb-2 size-6 text-secondary"></span>
86
- <p class="font-semibold">{appM.preview_metric_local()}</p>
87
- </div>
88
- <div class="rounded-2xl bg-accent/10 p-4">
89
- <span class="icon-[tabler--palette] mb-2 size-6 text-accent"></span>
90
- <p class="font-semibold">{appM.preview_metric_theme()}</p>
91
- </div>
92
- </div>
93
- </div>
94
- </div>
95
- </div>
96
- </aside>
97
- </div>
98
-
99
- <div class="grid gap-6 lg:grid-cols-[0.95fr_1.05fr]">
100
- <div id="status">
101
- <Card title={appM.status_title()} bordered shadow="md" class="bg-base-100/90 backdrop-blur">
102
- <p class="mb-5 text-sm text-base-content/65">{appM.status_description()}</p>
103
- {#if loading}
104
- <Skeleton variant="title" class="mb-3" />
105
- <Skeleton count={3} />
106
- <p class="sr-only" data-testid="service-status">{sharedM.home_loading()}</p>
107
- {:else if info}
108
- <Alert variant="success" title={appM.status_online({ name: info.name })}>
109
- <p data-testid="service-status">{info.name}</p>
110
- </Alert>
111
- <dl class="mt-5 grid gap-3 sm:grid-cols-2 text-sm">
112
- <div class="rounded-box border border-base-300/70 bg-base-200/60 p-4">
113
- <dt class="text-xs text-base-content/55">{appM.status_version()}</dt>
114
- <dd class="mt-1 font-semibold">{info.version}</dd>
115
- </div>
116
- <div class="rounded-box border border-base-300/70 bg-base-200/60 p-4">
117
- <dt class="text-xs text-base-content/55">{appM.status_started({ time: info.startedAt })}</dt>
118
- <dd class="mt-1 font-semibold">{appM.status_frontends_count({ count: String(info.frontends.length) })}</dd>
119
- </div>
120
- <div class="rounded-box border border-base-300/70 bg-base-200/60 p-4 sm:col-span-2">
121
- <dt class="text-xs text-base-content/55">{appM.status_frontends({ list: info.frontends.join(' / ') })}</dt>
122
- <dd class="mt-1 font-semibold">{sharedM.home_subtitle()}</dd>
123
- </div>
124
- </dl>
125
- {:else}
126
- <Alert variant="error" title={sharedM.home_error()}>
127
- <p data-testid="service-status">{errorMessage}</p>
128
- </Alert>
129
- {/if}
130
-
131
- <div class="mt-5">
132
- <Button type="button" variant="primary" loading={loading} onclick={refreshStatus}>
133
- {sharedM.home_refresh()}
134
- </Button>
135
- </div>
136
- </Card>
137
- </div>
138
-
139
- <section id="customize" class="grid gap-4 sm:grid-cols-2">
140
- <div class="rounded-[1.5rem] border border-base-300/70 bg-base-100/90 p-5 shadow-md">
141
- <span class="icon-[tabler--package] mb-4 size-7 text-primary"></span>
142
- <h2 class="text-lg font-bold">{appM.custom_shared_title()}</h2>
143
- <p class="mt-2 text-sm leading-6 text-base-content/65">{appM.custom_shared_body()}</p>
144
- </div>
145
- <div class="rounded-[1.5rem] border border-base-300/70 bg-base-100/90 p-5 shadow-md">
146
- <span class="icon-[tabler--message-language] mb-4 size-7 text-secondary"></span>
147
- <h2 class="text-lg font-bold">{appM.custom_local_title()}</h2>
148
- <p class="mt-2 text-sm leading-6 text-base-content/65">{appM.custom_local_body()}</p>
149
- </div>
150
- <div class="rounded-[1.5rem] border border-base-300/70 bg-base-100/90 p-5 shadow-md sm:col-span-2">
151
- <h2 class="text-lg font-bold">{appM.flow_title()}</h2>
152
- <ol class="mt-4 grid gap-3 md:grid-cols-4">
153
- <li class="rounded-box bg-base-200/70 p-4 text-sm">{appM.flow_contract()}</li>
154
- <li class="rounded-box bg-base-200/70 p-4 text-sm">{appM.flow_service()}</li>
155
- <li class="rounded-box bg-base-200/70 p-4 text-sm">{appM.flow_shared()}</li>
156
- <li class="rounded-box bg-base-200/70 p-4 text-sm">{appM.flow_frontend()}</li>
157
- </ol>
158
- </div>
159
- </section>
160
- </div>
161
- </section>
162
- {{/if}}
@@ -1,14 +0,0 @@
1
- {{! @skipIfEmpty }}
2
- {{#if fullstack.frontends.web}}
3
- <!doctype html>
4
- <html lang="%paraglide.lang%">
5
- <head>
6
- <meta charset="utf-8" />
7
- <meta name="viewport" content="width=device-width, initial-scale=1" />
8
- %sveltekit.head%
9
- </head>
10
- <body data-sveltekit-preload-data="hover">
11
- <div style="display: contents">%sveltekit.body%</div>
12
- </body>
13
- </html>
14
- {{/if}}
@@ -1,18 +0,0 @@
1
- {{! @skipIfEmpty }}
2
- {{#if fullstack.frontends.web}}
3
- <script lang="ts">
4
- import { setLocale } from '$lib/paraglide/runtime.js'
5
- import { AppShell } from '{{fullstack.sharedPackageName}}'
6
- import '../app.css'
7
-
8
- const { children } = $props()
9
-
10
- function syncLocale(locale: string) {
11
- setLocale(locale as Parameters<typeof setLocale>[0])
12
- }
13
- </script>
14
-
15
- <AppShell platform="web" onLocaleChange={syncLocale}>
16
- {@render children()}
17
- </AppShell>
18
- {{/if}}
@@ -1,162 +0,0 @@
1
- {{! @skipIfEmpty }}
2
- {{#if fullstack.frontends.web}}
3
- <script lang="ts">
4
- import type { AppInfo } from '{{fullstack.sharedPackageName}}'
5
- import * as appM from '$lib/paraglide/messages.js'
6
- import { Alert, Button, Card, Skeleton } from '@h-ai/ui'
7
- import { onMount } from 'svelte'
8
- import { fetchAppInfo, messages as sharedM } from '{{fullstack.sharedPackageName}}'
9
-
10
- let info = $state<AppInfo | null>(null)
11
- let loading = $state(true)
12
- let errorMessage = $state('')
13
-
14
- async function refreshStatus() {
15
- loading = true
16
- errorMessage = ''
17
- try {
18
- info = await fetchAppInfo()
19
- }
20
- catch {
21
- info = null
22
- errorMessage = sharedM.home_error()
23
- }
24
- finally {
25
- loading = false
26
- }
27
- }
28
-
29
- onMount(() => {
30
- void refreshStatus()
31
- })
32
- </script>
33
-
34
- <svelte:head>
35
- <title>{appM.page_title({ name: sharedM.app_name() })}</title>
36
- </svelte:head>
37
-
38
- <section class="space-y-8">
39
- <div class="grid gap-6 lg:grid-cols-[1.2fr_0.8fr]">
40
- <section class="relative overflow-hidden rounded-[2rem] border border-base-300/70 bg-gradient-to-br from-primary/15 via-base-100 to-secondary/15 p-6 shadow-2xl shadow-primary/10 lg:p-10">
41
- <div class="absolute right-8 top-8 hidden size-28 rounded-full bg-primary/20 blur-3xl sm:block"></div>
42
- <div class="relative z-10 max-w-2xl space-y-6">
43
- <span class="badge badge-primary badge-lg gap-2">
44
- <span class="icon-[tabler--rocket] size-4"></span>
45
- {appM.hero_badge()}
46
- </span>
47
- <div class="space-y-4">
48
- <h1 class="text-4xl font-black tracking-tight text-base-content sm:text-5xl">
49
- {appM.hero_title({ name: sharedM.app_name() })}
50
- </h1>
51
- <p class="max-w-xl text-lg leading-8 text-base-content/70">
52
- {appM.hero_subtitle()}
53
- </p>
54
- </div>
55
- <div class="flex flex-wrap gap-3">
56
- <a class="btn btn-primary shadow-lg shadow-primary/20" href="#status">
57
- <span class="icon-[tabler--activity-heartbeat] size-5"></span>
58
- {appM.hero_primary_action()}
59
- </a>
60
- <a class="btn btn-ghost" href="#customize">
61
- <span class="icon-[tabler--adjustments] size-5"></span>
62
- {appM.hero_secondary_action()}
63
- </a>
64
- </div>
65
- </div>
66
- </section>
67
-
68
- <aside class="rounded-[2rem] border border-base-300/70 bg-base-100/80 p-5 shadow-xl backdrop-blur">
69
- <div class="mockup-window border border-base-300 bg-base-200/70">
70
- <div class="space-y-4 bg-base-100 p-5">
71
- <div class="flex items-center justify-between">
72
- <div>
73
- <p class="text-sm font-semibold">{appM.preview_title()}</p>
74
- <p class="text-xs text-base-content/55">{appM.preview_body()}</p>
75
- </div>
76
- <span class="badge badge-success badge-outline">{appM.platform_name()}</span>
77
- </div>
78
- <div class="grid gap-3 text-sm">
79
- <div class="rounded-2xl bg-primary/10 p-4">
80
- <span class="icon-[tabler--components] mb-2 size-6 text-primary"></span>
81
- <p class="font-semibold">{appM.preview_metric_shared()}</p>
82
- </div>
83
- <div class="grid grid-cols-2 gap-3">
84
- <div class="rounded-2xl bg-secondary/10 p-4">
85
- <span class="icon-[tabler--language] mb-2 size-6 text-secondary"></span>
86
- <p class="font-semibold">{appM.preview_metric_local()}</p>
87
- </div>
88
- <div class="rounded-2xl bg-accent/10 p-4">
89
- <span class="icon-[tabler--palette] mb-2 size-6 text-accent"></span>
90
- <p class="font-semibold">{appM.preview_metric_theme()}</p>
91
- </div>
92
- </div>
93
- </div>
94
- </div>
95
- </div>
96
- </aside>
97
- </div>
98
-
99
- <div class="grid gap-6 lg:grid-cols-[0.95fr_1.05fr]">
100
- <div id="status">
101
- <Card title={appM.status_title()} bordered shadow="md" class="bg-base-100/90 backdrop-blur">
102
- <p class="mb-5 text-sm text-base-content/65">{appM.status_description()}</p>
103
- {#if loading}
104
- <Skeleton variant="title" class="mb-3" />
105
- <Skeleton count={3} />
106
- <p class="sr-only" data-testid="service-status">{sharedM.home_loading()}</p>
107
- {:else if info}
108
- <Alert variant="success" title={appM.status_online({ name: info.name })}>
109
- <p data-testid="service-status">{info.name}</p>
110
- </Alert>
111
- <dl class="mt-5 grid gap-3 sm:grid-cols-2 text-sm">
112
- <div class="rounded-box border border-base-300/70 bg-base-200/60 p-4">
113
- <dt class="text-xs text-base-content/55">{appM.status_version()}</dt>
114
- <dd class="mt-1 font-semibold">{info.version}</dd>
115
- </div>
116
- <div class="rounded-box border border-base-300/70 bg-base-200/60 p-4">
117
- <dt class="text-xs text-base-content/55">{appM.status_started({ time: info.startedAt })}</dt>
118
- <dd class="mt-1 font-semibold">{appM.status_frontends_count({ count: String(info.frontends.length) })}</dd>
119
- </div>
120
- <div class="rounded-box border border-base-300/70 bg-base-200/60 p-4 sm:col-span-2">
121
- <dt class="text-xs text-base-content/55">{appM.status_frontends({ list: info.frontends.join(' / ') })}</dt>
122
- <dd class="mt-1 font-semibold">{sharedM.home_subtitle()}</dd>
123
- </div>
124
- </dl>
125
- {:else}
126
- <Alert variant="error" title={sharedM.home_error()}>
127
- <p data-testid="service-status">{errorMessage}</p>
128
- </Alert>
129
- {/if}
130
-
131
- <div class="mt-5">
132
- <Button type="button" variant="primary" loading={loading} onclick={refreshStatus}>
133
- {sharedM.home_refresh()}
134
- </Button>
135
- </div>
136
- </Card>
137
- </div>
138
-
139
- <section id="customize" class="grid gap-4 sm:grid-cols-2">
140
- <div class="rounded-[1.5rem] border border-base-300/70 bg-base-100/90 p-5 shadow-md">
141
- <span class="icon-[tabler--package] mb-4 size-7 text-primary"></span>
142
- <h2 class="text-lg font-bold">{appM.custom_shared_title()}</h2>
143
- <p class="mt-2 text-sm leading-6 text-base-content/65">{appM.custom_shared_body()}</p>
144
- </div>
145
- <div class="rounded-[1.5rem] border border-base-300/70 bg-base-100/90 p-5 shadow-md">
146
- <span class="icon-[tabler--message-language] mb-4 size-7 text-secondary"></span>
147
- <h2 class="text-lg font-bold">{appM.custom_local_title()}</h2>
148
- <p class="mt-2 text-sm leading-6 text-base-content/65">{appM.custom_local_body()}</p>
149
- </div>
150
- <div class="rounded-[1.5rem] border border-base-300/70 bg-base-100/90 p-5 shadow-md sm:col-span-2">
151
- <h2 class="text-lg font-bold">{appM.flow_title()}</h2>
152
- <ol class="mt-4 grid gap-3 md:grid-cols-4">
153
- <li class="rounded-box bg-base-200/70 p-4 text-sm">{appM.flow_contract()}</li>
154
- <li class="rounded-box bg-base-200/70 p-4 text-sm">{appM.flow_service()}</li>
155
- <li class="rounded-box bg-base-200/70 p-4 text-sm">{appM.flow_shared()}</li>
156
- <li class="rounded-box bg-base-200/70 p-4 text-sm">{appM.flow_frontend()}</li>
157
- </ol>
158
- </div>
159
- </section>
160
- </div>
161
- </section>
162
- {{/if}}
@@ -1,7 +0,0 @@
1
- shellEmulator: true
2
-
3
- trustPolicy: no-downgrade
4
-
5
- packages:
6
- - 'packages/*'
7
- - 'apps/*'
@@ -1,20 +0,0 @@
1
- {
2
- "extends": "./.svelte-kit/tsconfig.json",
3
- "compilerOptions": {
4
- "moduleResolution": "bundler",
5
- "allowImportingTsExtensions": true,
6
- "allowJs": true,
7
- "checkJs": false,
8
- "strict": true,
9
- "verbatimModuleSyntax": true,
10
- "skipLibCheck": true
11
- },
12
- "include": [
13
- "src/**/*",
14
- "src/**/*.svelte"
15
- ],
16
- "exclude": [
17
- "node_modules",
18
- ".svelte-kit"
19
- ]
20
- }