create-skybridge 0.0.0-dev.c5cc415 → 0.0.0-dev.c5d7c61

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 (78) hide show
  1. package/LICENSE +21 -0
  2. package/dist/index.d.ts +1 -1
  3. package/dist/index.js +187 -44
  4. package/dist/index.test.d.ts +1 -0
  5. package/dist/index.test.js +35 -0
  6. package/index.js +6 -1
  7. package/package.json +13 -11
  8. package/template/.dockerignore +4 -0
  9. package/template/AGENTS.md +1 -0
  10. package/template/Dockerfile +53 -0
  11. package/template/README.md +49 -71
  12. package/template/_gitignore +4 -192
  13. package/template/alpic.json +1 -2
  14. package/template/node_modules/.bin/alpic +21 -0
  15. package/template/node_modules/.bin/sb +21 -0
  16. package/template/node_modules/.bin/skybridge +21 -0
  17. package/template/node_modules/.bin/tsc +21 -0
  18. package/template/node_modules/.bin/tsserver +21 -0
  19. package/template/node_modules/.bin/tsx +21 -0
  20. package/template/node_modules/.bin/vite +21 -0
  21. package/template/package.json +30 -10
  22. package/template/src/helpers.ts +4 -0
  23. package/template/src/index.css +59 -0
  24. package/template/src/server.ts +77 -0
  25. package/template/src/views/components/doc-link.tsx +22 -0
  26. package/template/src/views/components/doc.tsx +21 -0
  27. package/template/src/views/components/nav.tsx +31 -0
  28. package/template/src/views/components/progress.tsx +35 -0
  29. package/template/src/views/components/steps/outro.tsx +68 -0
  30. package/template/src/views/components/steps/state.tsx +47 -0
  31. package/template/src/views/components/steps/tool-call.tsx +53 -0
  32. package/template/src/views/components/steps/tool-output.tsx +40 -0
  33. package/template/src/views/images/mascot/beret.png +0 -0
  34. package/template/src/views/images/mascot/chapka.png +0 -0
  35. package/template/src/views/images/mascot/cowboy-hat.png +0 -0
  36. package/template/src/views/images/mascot/fez.png +0 -0
  37. package/template/src/views/images/mascot/jester-hat.png +0 -0
  38. package/template/src/views/images/mascot/mitre.png +0 -0
  39. package/template/src/views/images/mascot/non-la.png +0 -0
  40. package/template/src/views/images/mascot/original.png +0 -0
  41. package/template/src/views/images/mascot/propeller-beanie.png +0 -0
  42. package/template/src/views/images/mascot/ski-mask.png +0 -0
  43. package/template/src/views/images/mascot/sombrero.png +0 -0
  44. package/template/src/views/images/mascot/top-hat.png +0 -0
  45. package/template/src/views/images/mascot/viking-helmet.png +0 -0
  46. package/template/src/views/onboarding.tsx +63 -0
  47. package/template/src/views/use-mascot.ts +60 -0
  48. package/template/src/vite-manifest.d.ts +4 -0
  49. package/template/tsconfig.json +11 -0
  50. package/template/{web/vite.config.ts → vite.config.ts} +1 -3
  51. package/template/.cursor/mcp.json +0 -7
  52. package/template/.nvmrc +0 -1
  53. package/template/.vscode/launch.json +0 -16
  54. package/template/.vscode/settings.json +0 -3
  55. package/template/.vscode/tasks.json +0 -14
  56. package/template/docs/demo.gif +0 -0
  57. package/template/pnpm-lock.yaml +0 -317
  58. package/template/pnpm-workspace.yaml +0 -7
  59. package/template/server/nodemon.json +0 -5
  60. package/template/server/package.json +0 -36
  61. package/template/server/pnpm-lock.yaml +0 -3796
  62. package/template/server/src/env.ts +0 -12
  63. package/template/server/src/index.ts +0 -34
  64. package/template/server/src/middleware.ts +0 -54
  65. package/template/server/src/pokedex.ts +0 -148
  66. package/template/server/src/server.ts +0 -76
  67. package/template/server/tsconfig.json +0 -17
  68. package/template/web/components.json +0 -22
  69. package/template/web/package.json +0 -32
  70. package/template/web/pnpm-lock.yaml +0 -2629
  71. package/template/web/src/components/ui/shadcn-io/spinner/index.tsx +0 -272
  72. package/template/web/src/helpers.ts +0 -4
  73. package/template/web/src/index.css +0 -120
  74. package/template/web/src/utils.ts +0 -6
  75. package/template/web/src/widgets/pokemon.tsx +0 -203
  76. package/template/web/tsconfig.app.json +0 -34
  77. package/template/web/tsconfig.json +0 -13
  78. package/template/web/tsconfig.node.json +0 -26
@@ -1,194 +1,6 @@
1
- # =============================================================================
2
- # OPERATING SYSTEM FILES
3
- # =============================================================================
4
- .DS_Store
5
- .DS_Store?
6
- ._*
7
- .Spotlight-V100
8
- .Trashes
9
- ehthumbs.db
10
- Thumbs.db
11
-
12
- # =============================================================================
13
- # NODE.JS & PACKAGE MANAGERS
14
- # =============================================================================
15
1
  node_modules/
16
- npm-debug.log*
17
- yarn-debug.log*
18
- yarn-error.log*
19
- .pnpm-debug.log*
20
- .npm
21
- .pnp.js
22
- .pnp.cjs
23
- .pnp.mjs
24
- .pnp.json
25
- .pnp.ts
26
-
27
- # =============================================================================
28
- # TYPESCRIPT & JAVASCRIPT
29
- # =============================================================================
30
- *.tsbuildinfo
31
- .tscache/
32
- *.js.map
33
- *.mjs.map
34
- *.cjs.map
35
- *.d.ts.map
36
- *.d.ts
37
- !*.d.ts.template
38
- *.tgz
39
- .eslintcache
40
- .rollup.cache
41
-
42
- # =============================================================================
43
- # PYTHON
44
- # =============================================================================
45
- __pycache__/
46
- *.py[cod]
47
- *$py.class
48
- *.so
49
- .Python
50
- develop-eggs/
51
- eggs/
52
- .eggs/
53
- lib/
54
- lib64/
55
- parts/
56
- sdist/
57
- var/
58
- wheels/
59
- *.egg-info/
60
- .installed.cfg
61
- *.egg
62
- .pytest_cache/
63
- .coverage
64
- htmlcov/
65
- .tox/
66
- .venv
67
- venv/
68
- ENV/
69
-
70
- # =============================================================================
71
- # JAVA
72
- # =============================================================================
73
- *.class
74
- *.jar
75
- *.war
76
- *.nar
77
- *.ear
78
- hs_err_pid*
79
- target/
80
- .gradle/
81
-
82
- # =============================================================================
83
- # RUBY
84
- # =============================================================================
85
- *.gem
86
- *.rbc
87
- /.config
88
- /coverage/
89
- /InstalledFiles
90
- /pkg/
91
- /spec/reports/
92
- /spec/examples.txt
93
- /test/tmp/
94
- /test/version_tmp/
95
- /tmp/
96
- .byebug_history
97
-
98
- # =============================================================================
99
- # BUILD & DISTRIBUTION
100
- # =============================================================================
101
- build/
102
2
  dist/
103
- dist-ssr/
104
- out/
105
-
106
- # =============================================================================
107
- # COMPILED FILES
108
- # =============================================================================
109
- *.com
110
- *.dll
111
- *.exe
112
- *.o
113
-
114
- # =============================================================================
115
- # PACKAGE & ARCHIVE FILES
116
- # =============================================================================
117
- *.7z
118
- *.dmg
119
- *.gz
120
- *.iso
121
- *.rar
122
- *.tar
123
- *.tar.gz
124
- *.zip
125
-
126
- # =============================================================================
127
- # LOGS & DATABASES
128
- # =============================================================================
129
- *.log
130
- *.sql
131
- *.sqlite
132
- *.sqlite3
133
- logs/
134
-
135
- # =============================================================================
136
- # TESTING & COVERAGE
137
- # =============================================================================
138
- coverage/
139
- .nyc_output/
140
-
141
- # =============================================================================
142
- # CACHE & TEMPORARY FILES
143
- # =============================================================================
144
- .cache/
145
- .parcel-cache/
146
- *.bak
147
-
148
- # =============================================================================
149
- # ENVIRONMENT & CONFIGURATION
150
- # =============================================================================
151
- .env
152
- .env.local
153
- .env.development.local
154
- .env.test.local
155
- .env.production.local
156
- .sample-env
157
- sample.*
158
- !sample.template.*
159
- *.local
160
- mcp-servers.json
161
- mcp-config.json
162
-
163
- # =============================================================================
164
- # DEMO & EXAMPLE DIRECTORIES
165
- # =============================================================================
166
- demo/
167
- demos/
168
- example/
169
- examples/
170
- samples/
171
-
172
- # =============================================================================
173
- # GENERATED DOCUMENTATION
174
- # =============================================================================
175
- docs/api/
176
-
177
- # =============================================================================
178
- # EDITOR DIRECTORIES AND FILES
179
- # =============================================================================
180
- .vscode/*
181
- !.vscode/extensions.json
182
- .idea
183
- *.suo
184
- *.ntvs*
185
- *.njsproj
186
- *.sln
187
- *.sw?
188
-
189
- # =============================================================================
190
- # APPLICATION SPECIFIC
191
- # =============================================================================
192
- repomix-output*
193
- duckdata/
194
- .claude
3
+ .env*
4
+ .DS_store
5
+ *.tsbuildinfo
6
+ .skybridge/
@@ -1,4 +1,3 @@
1
1
  {
2
- "$schema": "https://assets.alpic.ai/alpic.json",
3
- "buildOutputDir": "server/dist"
2
+ "$schema": "https://assets.alpic.ai/alpic.json"
4
3
  }
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/home/runner/work/skybridge/skybridge/node_modules/.pnpm/alpic@1.104.1_@opentelemetry+api@1.9.0_arktype@2.1.27_rxjs@7.8.2_typescript@6.0.2/node_modules/alpic/node_modules:/home/runner/work/skybridge/skybridge/node_modules/.pnpm/alpic@1.104.1_@opentelemetry+api@1.9.0_arktype@2.1.27_rxjs@7.8.2_typescript@6.0.2/node_modules:/home/runner/work/skybridge/skybridge/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/home/runner/work/skybridge/skybridge/node_modules/.pnpm/alpic@1.104.1_@opentelemetry+api@1.9.0_arktype@2.1.27_rxjs@7.8.2_typescript@6.0.2/node_modules/alpic/node_modules:/home/runner/work/skybridge/skybridge/node_modules/.pnpm/alpic@1.104.1_@opentelemetry+api@1.9.0_arktype@2.1.27_rxjs@7.8.2_typescript@6.0.2/node_modules:/home/runner/work/skybridge/skybridge/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../alpic/bin/run.js" "$@"
19
+ else
20
+ exec node "$basedir/../alpic/bin/run.js" "$@"
21
+ fi
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/home/runner/work/skybridge/skybridge/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/home/runner/work/skybridge/skybridge/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../skybridge/bin/run.js" "$@"
19
+ else
20
+ exec node "$basedir/../skybridge/bin/run.js" "$@"
21
+ fi
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/home/runner/work/skybridge/skybridge/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/home/runner/work/skybridge/skybridge/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../skybridge/bin/run.js" "$@"
19
+ else
20
+ exec node "$basedir/../skybridge/bin/run.js" "$@"
21
+ fi
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/home/runner/work/skybridge/skybridge/node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/node_modules:/home/runner/work/skybridge/skybridge/node_modules/.pnpm/typescript@6.0.2/node_modules:/home/runner/work/skybridge/skybridge/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/home/runner/work/skybridge/skybridge/node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/node_modules:/home/runner/work/skybridge/skybridge/node_modules/.pnpm/typescript@6.0.2/node_modules:/home/runner/work/skybridge/skybridge/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../typescript/bin/tsc" "$@"
19
+ else
20
+ exec node "$basedir/../typescript/bin/tsc" "$@"
21
+ fi
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/home/runner/work/skybridge/skybridge/node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/node_modules:/home/runner/work/skybridge/skybridge/node_modules/.pnpm/typescript@6.0.2/node_modules:/home/runner/work/skybridge/skybridge/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/home/runner/work/skybridge/skybridge/node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/node_modules:/home/runner/work/skybridge/skybridge/node_modules/.pnpm/typescript@6.0.2/node_modules:/home/runner/work/skybridge/skybridge/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../typescript/bin/tsserver" "$@"
19
+ else
20
+ exec node "$basedir/../typescript/bin/tsserver" "$@"
21
+ fi
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/home/runner/work/skybridge/skybridge/node_modules/.pnpm/tsx@4.21.0/node_modules/tsx/node_modules:/home/runner/work/skybridge/skybridge/node_modules/.pnpm/tsx@4.21.0/node_modules:/home/runner/work/skybridge/skybridge/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/home/runner/work/skybridge/skybridge/node_modules/.pnpm/tsx@4.21.0/node_modules/tsx/node_modules:/home/runner/work/skybridge/skybridge/node_modules/.pnpm/tsx@4.21.0/node_modules:/home/runner/work/skybridge/skybridge/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../tsx/dist/cli.mjs" "$@"
19
+ else
20
+ exec node "$basedir/../tsx/dist/cli.mjs" "$@"
21
+ fi
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/home/runner/work/skybridge/skybridge/node_modules/.pnpm/vite@8.0.3_@types+node@24.12.0_esbuild@0.27.2_jiti@2.6.1_terser@5.44.1_tsx@4.21.0_yaml@2.8.2/node_modules/vite/node_modules:/home/runner/work/skybridge/skybridge/node_modules/.pnpm/vite@8.0.3_@types+node@24.12.0_esbuild@0.27.2_jiti@2.6.1_terser@5.44.1_tsx@4.21.0_yaml@2.8.2/node_modules:/home/runner/work/skybridge/skybridge/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/home/runner/work/skybridge/skybridge/node_modules/.pnpm/vite@8.0.3_@types+node@24.12.0_esbuild@0.27.2_jiti@2.6.1_terser@5.44.1_tsx@4.21.0_yaml@2.8.2/node_modules/vite/node_modules:/home/runner/work/skybridge/skybridge/node_modules/.pnpm/vite@8.0.3_@types+node@24.12.0_esbuild@0.27.2_jiti@2.6.1_terser@5.44.1_tsx@4.21.0_yaml@2.8.2/node_modules:/home/runner/work/skybridge/skybridge/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../vite/bin/vite.js" "$@"
19
+ else
20
+ exec node "$basedir/../vite/bin/vite.js" "$@"
21
+ fi
@@ -4,18 +4,38 @@
4
4
  "private": true,
5
5
  "description": "Alpic MCP Server Template",
6
6
  "type": "module",
7
- "packageManager": "pnpm@10.18.3",
8
7
  "scripts": {
9
- "dev": "pnpm --filter @apps-sdk-template/server dev",
10
- "build": "pnpm web:build && rm -rf server/dist && pnpm --filter=@apps-sdk-template/server --prod deploy server/dist && cp -r web/dist server/dist/assets && pnpm --filter=@apps-sdk-template/server build",
11
- "start": "pnpm server:start",
12
- "inspector": "pnpm --filter @apps-sdk-template/server inspector",
13
- "server:build": "pnpm --filter @apps-sdk-template/server build",
14
- "server:start": "pnpm --filter @apps-sdk-template/server start",
15
- "web:build": "pnpm --filter @apps-sdk-template/web build",
16
- "web:preview": "pnpm --filter @apps-sdk-template/web preview"
8
+ "dev": "skybridge dev",
9
+ "dev:tunnel": "skybridge dev --tunnel",
10
+ "build": "skybridge build",
11
+ "start": "skybridge start",
12
+ "deploy": "alpic deploy"
13
+ },
14
+ "dependencies": {
15
+ "@alpic-ai/ui": "^1.122.0",
16
+ "@modelcontextprotocol/sdk": "^1.29.0",
17
+ "lucide-react": "^1.14.0",
18
+ "react": "^19.2.4",
19
+ "react-dom": "^19.2.4",
20
+ "skybridge": ">=0.0.0-dev.c5d7c61",
21
+ "sonner": "^2.0.7",
22
+ "tw-animate-css": "^1.4.0",
23
+ "vite": "^8.0.3",
24
+ "zod": "^4.3.6"
17
25
  },
18
26
  "devDependencies": {
19
- "tsx": "^4.19.4"
27
+ "@skybridge/devtools": ">=0.35.14 <1.0.0",
28
+ "@tailwindcss/vite": "^4.2.4",
29
+ "@types/node": "^24.12.0",
30
+ "@types/react": "^19.2.14",
31
+ "@types/react-dom": "^19.2.3",
32
+ "@vitejs/plugin-react": "^6.0.1",
33
+ "alpic": "^1.104.1",
34
+ "tailwindcss": "^4.2.4",
35
+ "tsx": "^4.21.0",
36
+ "typescript": "^6.0.2"
37
+ },
38
+ "engines": {
39
+ "node": ">=24.14.1"
20
40
  }
21
41
  }
@@ -0,0 +1,4 @@
1
+ import { generateHelpers } from "skybridge/web";
2
+ import type { AppType } from "./server.js";
3
+
4
+ export const { useToolInfo, useCallTool } = generateHelpers<AppType>();
@@ -0,0 +1,59 @@
1
+ @import url("https://fonts.googleapis.com/css2?family=Mozilla+Text:wght@400..700&display=swap");
2
+ @import "tailwindcss";
3
+ @import "tw-animate-css";
4
+ @import "@alpic-ai/ui/theme";
5
+
6
+ @source "../node_modules/@alpic-ai/ui/src";
7
+
8
+ @theme {
9
+ --font-mozilla: "Mozilla Text", serif;
10
+ --animate-float: float 3s ease-in-out infinite;
11
+ --animate-twirl: twirl 20s ease-in-out infinite;
12
+ --animate-aurora: aurora 20s ease-in-out infinite;
13
+ --animate-gradient-flow: gradient-flow 6s linear infinite;
14
+ }
15
+
16
+ @keyframes gradient-flow {
17
+ 0% {
18
+ background-position: 200% 50%;
19
+ }
20
+ 100% {
21
+ background-position: 0% 50%;
22
+ }
23
+ }
24
+
25
+ @keyframes aurora {
26
+ 0%,
27
+ 100% {
28
+ background-position: 0% 50%;
29
+ }
30
+ 50% {
31
+ background-position: 100% 50%;
32
+ }
33
+ }
34
+
35
+ @keyframes float {
36
+ 0%,
37
+ 100% {
38
+ transform: translateY(0);
39
+ }
40
+ 50% {
41
+ transform: translateY(-6px);
42
+ }
43
+ }
44
+
45
+ @keyframes twirl {
46
+ 0%,
47
+ 80% {
48
+ transform: rotateY(0deg);
49
+ }
50
+ 85% {
51
+ transform: rotateY(180deg);
52
+ }
53
+ 95% {
54
+ transform: rotateY(180deg);
55
+ }
56
+ 100% {
57
+ transform: rotateY(360deg);
58
+ }
59
+ }
@@ -0,0 +1,77 @@
1
+ import { McpServer } from "skybridge/server";
2
+ import { z } from "zod";
3
+
4
+ const server = new McpServer(
5
+ {
6
+ name: "alpic-openai-app",
7
+ version: "0.0.1",
8
+ },
9
+ { capabilities: {} },
10
+ )
11
+ .registerTool(
12
+ {
13
+ name: "start",
14
+ description: "Onboard Skybridge",
15
+ inputSchema: {
16
+ name: z.string().optional().describe("The user name."),
17
+ },
18
+ view: {
19
+ component: "onboarding",
20
+ description: "Onboarding deck",
21
+ csp: {
22
+ resourceDomains: [
23
+ "https://fonts.googleapis.com",
24
+ "https://fonts.gstatic.com",
25
+ ],
26
+ redirectDomains: ["https://docs.skybridge.tech"],
27
+ },
28
+ },
29
+ },
30
+ async ({ name }) => {
31
+ return {
32
+ structuredContent: { name },
33
+ content: [{ type: "text", text: `User name: ${name}` }],
34
+ isError: false,
35
+ };
36
+ },
37
+ )
38
+ .registerTool(
39
+ {
40
+ name: "get-fortune-cookie",
41
+ description: "Get fortune cookie",
42
+ },
43
+ async () => {
44
+ const predictions = [
45
+ "A pleasant surprise is waiting for you.",
46
+ "Your hard work will soon pay off.",
47
+ "An unexpected friendship will brighten your week.",
48
+ "The best is yet to come.",
49
+ "A small step today leads to a giant leap tomorrow.",
50
+ "Trust your instincts: they are sharper than you think.",
51
+ "Adventure awaits just around the corner.",
52
+ "A long-forgotten idea will return with great success.",
53
+ "Kindness given today will be returned threefold.",
54
+ "Something you lost will soon be found.",
55
+ ];
56
+ const prediction =
57
+ predictions[Math.floor(Math.random() * predictions.length)];
58
+
59
+ // simulate backend work
60
+ await new Promise((resolve) => setTimeout(resolve, 1000));
61
+
62
+ return {
63
+ structuredContent: { prediction },
64
+ content: [{ type: "text", text: prediction }],
65
+ isError: false,
66
+ };
67
+ },
68
+ );
69
+
70
+ if (process.env.NODE_ENV === "production") {
71
+ const { default: manifest } = await import("./vite-manifest.js");
72
+ server.setViteManifest(manifest);
73
+ }
74
+
75
+ export default await server.run();
76
+
77
+ export type AppType = typeof server;
@@ -0,0 +1,22 @@
1
+ import type { ReactNode } from "react";
2
+ import { useOpenExternal } from "skybridge/web";
3
+
4
+ export default function DocLink({
5
+ href,
6
+ children,
7
+ }: {
8
+ href: string;
9
+ children: ReactNode;
10
+ }) {
11
+ // useOpenExternal: open a URL in a new browser tab from inside the iframe.
12
+ const openExternal = useOpenExternal();
13
+ return (
14
+ <button
15
+ type="button"
16
+ onClick={() => openExternal(href)}
17
+ className="underline underline-offset-4"
18
+ >
19
+ {children}
20
+ </button>
21
+ );
22
+ }
@@ -0,0 +1,21 @@
1
+ import type { ReactNode } from "react";
2
+
3
+ export default function Doc({ children }: { children: ReactNode }) {
4
+ return (
5
+ <p className="flex items-start gap-2 type-text-xs text-muted-foreground mt-auto">
6
+ <svg
7
+ viewBox="0 0 90 90"
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ role="img"
10
+ aria-label="Skybridge"
11
+ className="size-4 shrink-0 mt-0.5"
12
+ >
13
+ <path
14
+ d="M17.2704 89.9987C37.5976 24.3967 65.182 12.9084 89.9996 35.3807V84.1606C89.9996 87.3849 87.3858 89.9987 84.1615 89.9987H17.2704ZM84.1615 0C87.3858 0 89.9996 2.6139 89.9996 5.83819V30.9146C52.0566 -5.26767 14.9006 31.2366 0.000976562 57.6768V5.83819C0.00104114 2.6139 2.61486 2.23904e-08 5.83917 0H84.1615Z"
15
+ fill="currentColor"
16
+ />
17
+ </svg>
18
+ <span>{children}</span>
19
+ </p>
20
+ );
21
+ }
@@ -0,0 +1,31 @@
1
+ import { Button } from "@alpic-ai/ui/components/button";
2
+ import { Check } from "lucide-react";
3
+
4
+ export default function Nav({
5
+ current,
6
+ total,
7
+ onChange,
8
+ }: {
9
+ current: number;
10
+ total: number;
11
+ onChange: (index: number) => void;
12
+ }) {
13
+ return (
14
+ <div className="flex justify-end gap-2 mt-auto">
15
+ <Button
16
+ variant="secondary"
17
+ disabled={current === 0}
18
+ onClick={() => onChange(Math.max(current - 1, 0))}
19
+ >
20
+ Previous
21
+ </Button>
22
+ <Button
23
+ disabled={current === total - 1}
24
+ onClick={() => onChange(Math.min(current + 1, total - 1))}
25
+ >
26
+ <Check />
27
+ Next
28
+ </Button>
29
+ </div>
30
+ );
31
+ }
@@ -0,0 +1,35 @@
1
+ import {
2
+ Tooltip,
3
+ TooltipContent,
4
+ TooltipTrigger,
5
+ } from "@alpic-ai/ui/components/tooltip";
6
+
7
+ export default function Progress({
8
+ steps,
9
+ current,
10
+ onSelect,
11
+ }: {
12
+ steps: readonly string[];
13
+ current: number;
14
+ onSelect: (index: number) => void;
15
+ }) {
16
+ return (
17
+ <div className="flex gap-1.5">
18
+ {steps.map((label, i) => (
19
+ <Tooltip key={label}>
20
+ <TooltipTrigger asChild>
21
+ <button
22
+ type="button"
23
+ onClick={() => onSelect(i)}
24
+ className={`relative h-1 flex-1 rounded-full transition-opacity before:absolute before:-inset-y-5 before:inset-x-0 before:content-[''] [@media(hover:hover)]:hover:opacity-70 ${
25
+ i <= current ? "bg-primary" : "bg-muted"
26
+ }`}
27
+ aria-label={label}
28
+ />
29
+ </TooltipTrigger>
30
+ <TooltipContent>{label}</TooltipContent>
31
+ </Tooltip>
32
+ ))}
33
+ </div>
34
+ );
35
+ }