@telemetryos/cli 1.11.0 → 1.13.0

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 (51) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/dist/commands/claude-code.d.ts +2 -0
  3. package/dist/commands/claude-code.js +29 -0
  4. package/dist/commands/init.js +22 -9
  5. package/dist/index.js +2 -0
  6. package/dist/services/create-project.d.ts +13 -0
  7. package/dist/services/create-project.js +188 -0
  8. package/dist/services/project-config.d.ts +3 -0
  9. package/dist/services/project-config.js +3 -0
  10. package/dist/services/run-server.js +186 -60
  11. package/dist/utils/ansi.d.ts +1 -0
  12. package/dist/utils/ansi.js +1 -0
  13. package/dist/utils/template.d.ts +2 -0
  14. package/dist/utils/template.js +30 -0
  15. package/package.json +4 -4
  16. package/templates/{vite-react-typescript → claude-code}/CLAUDE.md +10 -3
  17. package/templates/{vite-react-typescript → claude-code}/_claude/skills/tos-architecture/SKILL.md +138 -61
  18. package/templates/{vite-react-typescript → claude-code}/_claude/skills/tos-debugging/SKILL.md +2 -2
  19. package/templates/{vite-react-typescript → claude-code}/_claude/skills/tos-media-api/SKILL.md +97 -10
  20. package/templates/{vite-react-typescript → claude-code}/_claude/skills/tos-multi-mode/SKILL.md +97 -4
  21. package/templates/{vite-react-typescript → claude-code}/_claude/skills/tos-requirements/SKILL.md +70 -5
  22. package/templates/{vite-react-typescript → claude-code}/_claude/skills/tos-store-sync/SKILL.md +4 -2
  23. package/templates/{vite-react-typescript → claude-code}/_claude/skills/tos-weather-api/SKILL.md +7 -6
  24. package/templates/claude-code/_claude/skills/tos-web-ui-design/SKILL.md +373 -0
  25. package/templates/vite-react-typescript/_gitignore +4 -2
  26. package/templates/vite-react-typescript/telemetry.config.json +2 -1
  27. package/templates/vite-react-typescript-web/_gitignore +32 -0
  28. package/templates/vite-react-typescript-web/assets/telemetryos-wordmark.svg +11 -0
  29. package/templates/vite-react-typescript-web/assets/tos-app.svg +12 -0
  30. package/templates/vite-react-typescript-web/index.html +15 -0
  31. package/templates/vite-react-typescript-web/package.json +24 -0
  32. package/templates/vite-react-typescript-web/src/App.tsx +25 -0
  33. package/templates/vite-react-typescript-web/src/hooks/store.ts +8 -0
  34. package/templates/vite-react-typescript-web/src/index.css +24 -0
  35. package/templates/vite-react-typescript-web/src/index.tsx +11 -0
  36. package/templates/vite-react-typescript-web/src/views/Render.css +67 -0
  37. package/templates/vite-react-typescript-web/src/views/Render.tsx +44 -0
  38. package/templates/vite-react-typescript-web/src/views/Settings.tsx +72 -0
  39. package/templates/vite-react-typescript-web/src/views/Web.css +105 -0
  40. package/templates/vite-react-typescript-web/src/views/Web.tsx +52 -0
  41. package/templates/vite-react-typescript-web/telemetry.config.json +16 -0
  42. package/templates/vite-react-typescript-web/tsconfig.json +19 -0
  43. package/templates/vite-react-typescript-web/vite.config.ts +18 -0
  44. package/templates/vite-react-typescript/_claude/skills/tos-render-design/SKILL.md +0 -624
  45. /package/templates/{vite-react-typescript → claude-code}/AGENTS.md +0 -0
  46. /package/templates/{vite-react-typescript → claude-code}/_claude/settings.local.json +0 -0
  47. /package/templates/{vite-react-typescript → claude-code}/_claude/skills/tos-proxy-fetch/SKILL.md +0 -0
  48. /package/templates/{vite-react-typescript → claude-code}/_claude/skills/tos-render-kiosk-design/SKILL.md +0 -0
  49. /package/templates/{vite-react-typescript → claude-code}/_claude/skills/tos-render-signage-design/SKILL.md +0 -0
  50. /package/templates/{vite-react-typescript → claude-code}/_claude/skills/tos-render-ui-design/SKILL.md +0 -0
  51. /package/templates/{vite-react-typescript → claude-code}/_claude/skills/tos-settings-ui/SKILL.md +0 -0
@@ -0,0 +1,12 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
3
+ <svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="258pt" height="258pt" viewBox="0 0 258 258" style="" preserveAspectRatio="xMidYMid meet">
4
+ <g fill="#000000FF">
5
+ <path d="M 50.000 2.594 C 26.451 7.639 7.292 27.262 2.532 51.208 C 0.208 62.898 0.258 195.123 2.591 206.643 C 6.873 227.792 21.909 245.496 41.686 252.675 C 52.935 256.758 62.175 257.162 135.500 256.771 C 197.509 256.441 205.104 256.227 210.465 254.658 C 232.534 248.202 248.346 232.415 254.695 210.500 C 256.258 205.103 256.466 197.335 256.760 133.195 C 257.134 51.729 257.005 49.878 249.920 35.226 C 242.061 18.972 225.455 6.257 207.185 2.503 C 196.815 0.372 59.999 0.451 50.000 2.594 M 218.171 67.655 C 219.177 68.565 220.000 70.360 220.000 71.644 C 220.000 74.019 217.097 85.638 214.346 94.269 C 212.009 101.603 210.642 102.000 187.705 102.000 C 170.049 102.000 168.159 102.167 166.622 103.865 C 165.656 104.932 160.251 123.192 153.980 146.574 C 146.078 176.037 142.457 187.988 140.988 189.460 C 139.175 191.274 137.454 191.536 125.419 191.829 C 105.566 192.311 104.849 191.534 109.420 174.500 C 110.748 169.550 115.247 152.778 119.417 137.229 C 123.588 121.680 127.000 107.932 127.000 106.679 C 127.000 102.305 125.651 102.000 106.300 102.000 C 89.333 102.000 87.854 101.854 86.000 100.000 C 84.900 98.900 84.000 97.434 84.000 96.742 C 84.000 96.050 85.538 89.872 87.417 83.012 C 90.090 73.257 91.409 70.045 93.473 68.270 L 96.112 66.000 156.227 66.000 C 210.762 66.000 216.512 66.154 218.171 67.655 M 113.171 112.655 C 114.177 113.565 115.000 115.215 115.000 116.322 C 115.000 119.129 109.072 140.911 107.719 143.079 C 105.740 146.247 102.139 147.000 88.953 147.000 C 77.333 147.000 75.794 146.794 74.000 145.000 C 72.900 143.900 72.001 142.438 72.002 141.750 C 72.004 139.717 77.964 117.689 79.145 115.352 C 80.934 111.808 83.867 111.139 97.921 111.068 C 109.071 111.011 111.652 111.280 113.171 112.655 M 77.495 66.636 C 80.995 67.979 80.987 71.343 77.456 84.594 C 75.311 92.642 73.282 98.164 71.996 99.451 C 70.173 101.276 68.473 101.536 56.419 101.829 C 36.114 102.322 35.816 101.938 41.058 82.083 C 45.310 65.978 45.281 66.000 62.474 66.000 C 69.823 66.000 76.583 66.286 77.495 66.636 "/></g>
6
+ <g fill="#F7B435FF">
7
+ <path d="M 93.473 68.270 C 91.409 70.045 90.090 73.257 87.417 83.012 C 85.538 89.872 84.000 96.050 84.000 96.742 C 84.000 97.434 84.900 98.900 86.000 100.000 C 87.854 101.854 89.333 102.000 106.300 102.000 C 125.651 102.000 127.000 102.305 127.000 106.679 C 127.000 107.932 123.588 121.680 119.417 137.229 C 115.247 152.778 110.748 169.550 109.420 174.500 C 104.849 191.534 105.566 192.311 125.419 191.829 C 137.454 191.536 139.175 191.274 140.988 189.460 C 142.457 187.988 146.078 176.037 153.980 146.574 C 160.251 123.192 165.656 104.932 166.622 103.865 C 168.159 102.167 170.049 102.000 187.705 102.000 C 210.642 102.000 212.009 101.603 214.346 94.269 C 217.097 85.638 220.000 74.019 220.000 71.644 C 220.000 70.360 219.177 68.565 218.171 67.655 C 216.512 66.154 210.762 66.000 156.227 66.000 L 96.112 66.000 93.473 68.270 "/></g>
8
+ <g fill="#F7B435FF">
9
+ <path d="M 82.365 112.169 C 79.454 113.579 78.540 115.677 75.032 129.000 C 71.441 142.634 71.453 142.453 74.000 145.000 C 75.794 146.794 77.333 147.000 88.953 147.000 C 102.139 147.000 105.740 146.247 107.719 143.079 C 109.072 140.911 115.000 119.129 115.000 116.322 C 115.000 111.825 112.301 110.995 97.921 111.068 C 90.540 111.105 83.539 111.601 82.365 112.169 "/></g>
10
+ <g fill="#F7B435FF">
11
+ <path d="M 46.614 68.250 C 44.748 69.931 43.343 73.430 41.058 82.083 C 35.816 101.938 36.114 102.322 56.419 101.829 C 68.473 101.536 70.173 101.276 71.996 99.451 C 73.282 98.164 75.311 92.642 77.456 84.594 C 80.987 71.343 80.995 67.979 77.495 66.636 C 76.583 66.286 69.823 66.000 62.474 66.000 C 50.023 66.000 48.941 66.154 46.614 68.250 "/></g>
12
+ </svg>
@@ -0,0 +1,15 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>{{title}}</title>
7
+ <link rel="preconnect" href="https://fonts.googleapis.com">
8
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
+ <link href="https://fonts.googleapis.com/css2?family=Exo:ital,wght@0,100..900;1,100..900&family=Rubik:ital,wght@0,300..900;1,300..900&display=swap" rel="stylesheet">
10
+ <script type="module" src="/src/index.tsx"></script>
11
+ </head>
12
+ <body>
13
+ <div id="app"></div>
14
+ </body>
15
+ </html>
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "{{name}}",
3
+ "version": "{{version}}",
4
+ "description": "{{description}}",
5
+ "author": "{{author}}",
6
+ "scripts": {
7
+ "dev": "tos serve",
8
+ "build": "tsc && vite build"
9
+ },
10
+ "dependencies": {
11
+ "react": "^19.1.1",
12
+ "react-dom": "^19.1.1",
13
+ "react-router": "^7.9.1"
14
+ },
15
+ "devDependencies": {
16
+ "@rollup/plugin-typescript": "^12.1.2",
17
+ "@types/node": "^22.15.3",
18
+ "@types/react": "^19.1.12",
19
+ "@types/react-dom": "^19.1.9",
20
+ "typescript": "^5.8.3",
21
+ "vite": "^6.3.5",
22
+ "@vitejs/plugin-react": "^5.0.2"
23
+ }
24
+ }
@@ -0,0 +1,25 @@
1
+ import { createBrowserRouter, RouterProvider } from 'react-router'
2
+ import { Render } from './views/Render'
3
+ import { Settings } from './views/Settings'
4
+ import { Web } from './views/Web'
5
+
6
+ const router = createBrowserRouter([
7
+ {
8
+ path: '/render',
9
+ Component: Render,
10
+ },
11
+ {
12
+ path: '/settings',
13
+ Component: Settings,
14
+ },
15
+ {
16
+ path: '/{{name}}',
17
+ Component: Web,
18
+ },
19
+ ])
20
+
21
+ export function App() {
22
+ return (
23
+ <RouterProvider router={router} />
24
+ )
25
+ }
@@ -0,0 +1,8 @@
1
+ import { createUseInstanceStoreState, createUseApplicationStoreState } from '@telemetryos/sdk/react'
2
+
3
+ // Instance-scoped (Settings ↔ Render sync)
4
+ export const useUiScaleStoreState = createUseInstanceStoreState<number>('ui-scale', 1)
5
+ export const useSubtitleStoreState = createUseInstanceStoreState<string>('subtitle', 'Change this line in settings ⚙️ ↗️')
6
+
7
+ // Application-scoped (accessible from Settings, Render, and Web)
8
+ export const useWelcomeMessageStoreState = createUseApplicationStoreState<string>('welcome-message', 'Welcome!')
@@ -0,0 +1,24 @@
1
+ * {
2
+ box-sizing: border-box;
3
+ }
4
+
5
+ html {
6
+ font-size: 1vmax;
7
+ height: 100%;
8
+ }
9
+
10
+ body {
11
+ margin: 0;
12
+ height: 100%;
13
+ }
14
+
15
+ #app {
16
+ height: 100%;
17
+ display: flex;
18
+ flex-direction: column;
19
+
20
+ font-family: "Rubik", sans-serif;
21
+ font-optical-sizing: auto;
22
+ font-weight: normal;
23
+ font-style: normal;
24
+ }
@@ -0,0 +1,11 @@
1
+ /// <reference types="vite/client" />
2
+
3
+ import './index.css'
4
+
5
+ import { createRoot } from 'react-dom/client'
6
+ import { App } from './App'
7
+ import { configure } from '@telemetryos/sdk'
8
+
9
+ configure('{{name}}')
10
+
11
+ createRoot(document.querySelector('#app')!).render(<App />)
@@ -0,0 +1,67 @@
1
+ .render {
2
+ flex: 1;
3
+ display: flex;
4
+ flex-direction: column;
5
+ align-items: center;
6
+ justify-content: space-between;
7
+ gap: 2rem;
8
+ padding: 3rem;
9
+ color: hsl(210 40% 88%);
10
+ background: hsl(212 28% 10%);
11
+ overflow: hidden;
12
+ }
13
+
14
+ .render__logo {
15
+ width: 30rem;
16
+ max-width: 50%;
17
+ }
18
+
19
+ .render__hero {
20
+ display: flex;
21
+ flex-direction: column;
22
+ align-items: center;
23
+ gap: 2rem;
24
+ }
25
+
26
+ .render__hero-title {
27
+ font-size: 5rem;
28
+ font-weight: 600;
29
+ text-align: center;
30
+ }
31
+
32
+ .render__hero-subtitle {
33
+ font-size: 3rem;
34
+ text-align: center;
35
+ }
36
+
37
+ .render__docs-information {
38
+ display: flex;
39
+ flex-direction: column;
40
+ align-items: center;
41
+ gap: 2rem;
42
+ }
43
+
44
+ .render__docs-information-title {
45
+ font-size: 2rem;
46
+ font-weight: 600;
47
+ text-align: center;
48
+ }
49
+
50
+ .render__docs-information-text {
51
+ font-size: 2rem;
52
+ max-width: 60rem;
53
+ text-align: center;
54
+ }
55
+
56
+ .render__docs-information-button {
57
+ display: flex;
58
+ align-items: center;
59
+ background: rgb(248, 180, 53);
60
+ text-transform: uppercase;
61
+ font-size: 2rem;
62
+ text-decoration: none;
63
+ color: black;
64
+ font-weight: bold;
65
+ padding: 1rem 2rem;
66
+ border-radius: 1rem;
67
+ }
@@ -0,0 +1,44 @@
1
+ import { useUiScaleToSetRem } from '@telemetryos/sdk/react'
2
+ import wordMarkPath from '../../assets/telemetryos-wordmark.svg'
3
+ import { useSubtitleStoreState, useUiScaleStoreState } from '../hooks/store'
4
+ import './Render.css'
5
+
6
+ export function Render() {
7
+ const [, uiScale] = useUiScaleStoreState()
8
+ useUiScaleToSetRem(uiScale)
9
+ const [isLoading, subtitle] = useSubtitleStoreState()
10
+
11
+ return (
12
+ <div className="render">
13
+ <img src={wordMarkPath} alt="TelemetryOS" className="render__logo" />
14
+ <div className="render__hero">
15
+ {uiScale < 1.5 && (
16
+ <div className="render__hero-title">Welcome to TelemetryOS SDK</div>
17
+ )}
18
+ <div className="render__hero-subtitle">{isLoading ? 'Loading...' : subtitle}</div>
19
+ </div>
20
+ <div className="render__docs-information">
21
+ {uiScale < 1.2 && (
22
+ <>
23
+ <div className="render__docs-information-title">
24
+ To get started, edit the Render.tsx and Settings.tsx files
25
+ </div>
26
+ <div className="render__docs-information-text">
27
+ Visit our documentation on building applications to learn more
28
+ </div>
29
+ </>
30
+ )}
31
+ {uiScale < 1.35 && (
32
+ <a
33
+ className="render__docs-information-button"
34
+ href="https://docs.telemetryos.com/docs/sdk-getting-started"
35
+ target="_blank"
36
+ rel="noreferrer"
37
+ >
38
+ Documentation
39
+ </a>
40
+ )}
41
+ </div>
42
+ </div>
43
+ )
44
+ }
@@ -0,0 +1,72 @@
1
+ import {
2
+ SettingsContainer,
3
+ SettingsDivider,
4
+ SettingsField,
5
+ SettingsHeading,
6
+ SettingsInputFrame,
7
+ SettingsLabel,
8
+ SettingsSliderFrame,
9
+ } from '@telemetryos/sdk/react'
10
+ import { useSubtitleStoreState, useUiScaleStoreState, useWelcomeMessageStoreState } from '../hooks/store'
11
+
12
+ export function Settings() {
13
+ const [isLoadingUiScale, uiScale, setUiScale] = useUiScaleStoreState(5)
14
+ const [isLoadingSubtitle, subtitle, setSubtitle] = useSubtitleStoreState(250)
15
+ const [isLoadingWelcome, welcomeMessage, setWelcomeMessage] = useWelcomeMessageStoreState(250)
16
+
17
+ return (
18
+ <SettingsContainer>
19
+
20
+ <SettingsHeading>Render</SettingsHeading>
21
+
22
+ <SettingsField>
23
+ <SettingsLabel>UI Scale</SettingsLabel>
24
+ <SettingsSliderFrame>
25
+ <input
26
+ type="range"
27
+ min={1}
28
+ max={3}
29
+ step={0.01}
30
+ disabled={isLoadingUiScale}
31
+ value={uiScale}
32
+ onChange={(e) => setUiScale(parseFloat(e.target.value))}
33
+ />
34
+ <span>{uiScale}x</span>
35
+ </SettingsSliderFrame>
36
+ </SettingsField>
37
+
38
+ <SettingsDivider />
39
+
40
+ <SettingsField>
41
+ <SettingsLabel>Subtitle Text</SettingsLabel>
42
+ <SettingsInputFrame>
43
+ <input
44
+ type="text"
45
+ placeholder='Some text for the subtitle...'
46
+ value={subtitle}
47
+ onChange={(e) => setSubtitle(e.target.value)}
48
+ disabled={isLoadingSubtitle}
49
+ />
50
+ </SettingsInputFrame>
51
+ </SettingsField>
52
+
53
+ <SettingsDivider />
54
+
55
+ <SettingsHeading>Web</SettingsHeading>
56
+
57
+ <SettingsField>
58
+ <SettingsLabel>Welcome Message</SettingsLabel>
59
+ <SettingsInputFrame>
60
+ <input
61
+ type="text"
62
+ placeholder='A welcome message for the web view...'
63
+ value={welcomeMessage}
64
+ onChange={(e) => setWelcomeMessage(e.target.value)}
65
+ disabled={isLoadingWelcome}
66
+ />
67
+ </SettingsInputFrame>
68
+ </SettingsField>
69
+
70
+ </SettingsContainer>
71
+ )
72
+ }
@@ -0,0 +1,105 @@
1
+ /* Web Mount Point View */
2
+
3
+ html:has(.web) {
4
+ font-size: 16px;
5
+ }
6
+
7
+ .web {
8
+ display: flex;
9
+ flex-direction: column;
10
+ align-items: center;
11
+ justify-content: center;
12
+ min-height: 100vh;
13
+ background: #0f172a;
14
+ color: #cbd5e1;
15
+ font-family: 'Rubik', system-ui, sans-serif;
16
+ }
17
+
18
+ /* Loading */
19
+ .web--loading {
20
+ align-items: center;
21
+ justify-content: center;
22
+ }
23
+
24
+ .web__loading-text {
25
+ font-size: 1.5rem;
26
+ color: #64748b;
27
+ animation: web-pulse 1.5s ease-in-out infinite;
28
+ }
29
+
30
+ @keyframes web-pulse {
31
+ 0%, 100% { opacity: 0.5; }
32
+ 50% { opacity: 1; }
33
+ }
34
+
35
+ /* Container */
36
+ .web__container {
37
+ width: 100%;
38
+ max-width: 640px;
39
+ padding: 3rem 2rem;
40
+ text-align: center;
41
+ }
42
+
43
+ .web__title {
44
+ font-size: 2.5rem;
45
+ font-weight: 700;
46
+ margin: 0 0 1.5rem;
47
+ color: #f8fafc;
48
+ }
49
+
50
+ .web__description {
51
+ font-size: 1rem;
52
+ line-height: 1.6;
53
+ color: #94a3b8;
54
+ margin: 0 0 1rem;
55
+ }
56
+
57
+ /* Info grid */
58
+ .web__info {
59
+ display: flex;
60
+ flex-direction: column;
61
+ gap: 0.5rem;
62
+ margin: 2rem 0;
63
+ }
64
+
65
+ .web__info-item {
66
+ display: flex;
67
+ align-items: center;
68
+ justify-content: space-between;
69
+ padding: 0.75rem 1.25rem;
70
+ background: #1e293b;
71
+ border: 1px solid #334155;
72
+ border-radius: 0.5rem;
73
+ }
74
+
75
+ .web__info-label {
76
+ font-size: 0.875rem;
77
+ font-weight: 600;
78
+ color: #64748b;
79
+ text-transform: uppercase;
80
+ letter-spacing: 0.05em;
81
+ }
82
+
83
+ .web__info-value {
84
+ font-size: 0.875rem;
85
+ color: #f8fafc;
86
+ }
87
+
88
+ /* Docs link */
89
+ .web__docs-link {
90
+ display: inline-block;
91
+ margin-top: 1rem;
92
+ padding: 0.75rem 2rem;
93
+ background: rgb(248, 180, 53);
94
+ color: black;
95
+ font-size: 1rem;
96
+ font-weight: 700;
97
+ text-decoration: none;
98
+ text-transform: uppercase;
99
+ border-radius: 0.5rem;
100
+ transition: background 0.15s;
101
+ }
102
+
103
+ .web__docs-link:hover {
104
+ background: rgb(234, 166, 39);
105
+ }
@@ -0,0 +1,52 @@
1
+ import { useWelcomeMessageStoreState } from '../hooks/store'
2
+ import './Web.css'
3
+
4
+ export function Web() {
5
+ const [isLoading, welcomeMessage] = useWelcomeMessageStoreState()
6
+
7
+ if (isLoading) {
8
+ return (
9
+ <div className="web web--loading">
10
+ <div className="web__loading-text">Loading...</div>
11
+ </div>
12
+ )
13
+ }
14
+
15
+ return (
16
+ <div className="web">
17
+ <div className="web__container">
18
+ <h1 className="web__title">{welcomeMessage}</h1>
19
+ <p className="web__description">
20
+ This is the <strong>Web mount point</strong> — a browser-accessible interface
21
+ that runs outside the device display and admin settings.
22
+ </p>
23
+ <p className="web__description">
24
+ The welcome message above is stored in the application-scoped store.
25
+ Change it in Settings to see it update here.
26
+ </p>
27
+ <div className="web__info">
28
+ <div className="web__info-item">
29
+ <span className="web__info-label">Store Access</span>
30
+ <span className="web__info-value">Application &amp; Dynamic Namespace</span>
31
+ </div>
32
+ <div className="web__info-item">
33
+ <span className="web__info-label">Runs In</span>
34
+ <span className="web__info-value">Any Browser</span>
35
+ </div>
36
+ <div className="web__info-item">
37
+ <span className="web__info-label">Use Cases</span>
38
+ <span className="web__info-value">Staff Desks, Public Forms, Dashboards</span>
39
+ </div>
40
+ </div>
41
+ <a
42
+ className="web__docs-link"
43
+ href="https://docs.telemetryos.com/docs/sdk-getting-started"
44
+ target="_blank"
45
+ rel="noreferrer"
46
+ >
47
+ Documentation
48
+ </a>
49
+ </div>
50
+ </div>
51
+ )
52
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "{{name}}",
3
+ "description": "{{description}}",
4
+ "logoPath": "assets/tos-app.svg",
5
+ "version": "{{version}}",
6
+ "useSpaRouting": true,
7
+ "mountPoints": {
8
+ "render": "/render",
9
+ "settings": "/settings",
10
+ "web": "/{{name}}"
11
+ },
12
+ "devServer": {
13
+ "runCommand": "vite --port 3000",
14
+ "url": "http://localhost:3000"
15
+ }
16
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "compilerOptions": {
3
+ "alwaysStrict": true,
4
+ "declaration": true,
5
+ "strict": true,
6
+ "lib": ["DOM", "ESNext"],
7
+ "target": "ES2019",
8
+ "moduleResolution": "bundler",
9
+ "allowSyntheticDefaultImports": true,
10
+ "esModuleInterop": true,
11
+ "isolatedModules": true,
12
+ "resolveJsonModule": true,
13
+ "jsx": "react-jsx",
14
+ "skipLibCheck": true,
15
+ "outDir": "./dist",
16
+ "rootDir": "./src"
17
+ },
18
+ "include": ["./src"]
19
+ }
@@ -0,0 +1,18 @@
1
+ import typescript from '@rollup/plugin-typescript'
2
+ import react from '@vitejs/plugin-react'
3
+ import { defineConfig } from 'vite'
4
+
5
+ export default defineConfig({
6
+ plugins: [
7
+ typescript(),
8
+ react(),
9
+ {
10
+ name: 'suppress-urls',
11
+ configureServer(server) {
12
+ return () => {
13
+ server.printUrls = () => { }
14
+ }
15
+ },
16
+ },
17
+ ],
18
+ })