skillverse 0.1.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.
- package/.prettierrc +10 -0
- package/README.md +369 -0
- package/client/README.md +73 -0
- package/client/eslint.config.js +23 -0
- package/client/index.html +13 -0
- package/client/package.json +41 -0
- package/client/postcss.config.js +6 -0
- package/client/public/vite.svg +1 -0
- package/client/src/App.css +42 -0
- package/client/src/App.tsx +26 -0
- package/client/src/assets/react.svg +1 -0
- package/client/src/components/AddSkillDialog.tsx +249 -0
- package/client/src/components/Layout.tsx +134 -0
- package/client/src/components/LinkWorkspaceDialog.tsx +196 -0
- package/client/src/components/LoadingSpinner.tsx +57 -0
- package/client/src/components/SkillCard.tsx +269 -0
- package/client/src/components/Toast.tsx +44 -0
- package/client/src/components/Tooltip.tsx +132 -0
- package/client/src/index.css +168 -0
- package/client/src/lib/api.ts +196 -0
- package/client/src/main.tsx +10 -0
- package/client/src/pages/Dashboard.tsx +209 -0
- package/client/src/pages/Marketplace.tsx +282 -0
- package/client/src/pages/Settings.tsx +136 -0
- package/client/src/pages/SkillLibrary.tsx +163 -0
- package/client/src/pages/Workspaces.tsx +662 -0
- package/client/src/stores/appStore.ts +222 -0
- package/client/tailwind.config.js +82 -0
- package/client/tsconfig.app.json +28 -0
- package/client/tsconfig.json +7 -0
- package/client/tsconfig.node.json +26 -0
- package/client/vite.config.ts +26 -0
- package/package.json +34 -0
- package/registry/.env.example +5 -0
- package/registry/Dockerfile +42 -0
- package/registry/docker-compose.yml +33 -0
- package/registry/package.json +37 -0
- package/registry/prisma/schema.prisma +59 -0
- package/registry/src/index.ts +34 -0
- package/registry/src/lib/db.ts +3 -0
- package/registry/src/middleware/errorHandler.ts +35 -0
- package/registry/src/routes/auth.ts +152 -0
- package/registry/src/routes/skills.ts +295 -0
- package/registry/tsconfig.json +23 -0
- package/server/.env.example +11 -0
- package/server/package.json +60 -0
- package/server/prisma/schema.prisma +73 -0
- package/server/public/assets/index-BsYtpZSa.css +1 -0
- package/server/public/assets/index-Dfr_6UV8.js +20 -0
- package/server/public/index.html +14 -0
- package/server/public/vite.svg +1 -0
- package/server/src/bin.ts +428 -0
- package/server/src/config.ts +39 -0
- package/server/src/index.ts +112 -0
- package/server/src/lib/db.ts +14 -0
- package/server/src/middleware/errorHandler.ts +40 -0
- package/server/src/middleware/logger.ts +12 -0
- package/server/src/routes/dashboard.ts +102 -0
- package/server/src/routes/marketplace.ts +273 -0
- package/server/src/routes/skills.ts +294 -0
- package/server/src/routes/workspaces.ts +168 -0
- package/server/src/services/bundleService.ts +123 -0
- package/server/src/services/skillService.ts +722 -0
- package/server/src/services/workspaceService.ts +521 -0
- package/server/src/verify-sync.ts +91 -0
- package/server/tsconfig.json +19 -0
- package/server/tsup.config.ts +18 -0
- package/shared/package.json +21 -0
- package/shared/pnpm-lock.yaml +24 -0
- package/shared/src/index.ts +169 -0
- package/shared/tsconfig.json +10 -0
- package/tsconfig.json +25 -0
package/.prettierrc
ADDED
package/README.md
ADDED
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
# SkillVerse
|
|
2
|
+
|
|
3
|
+
<div align="center">
|
|
4
|
+
|
|
5
|
+
**🚀 Local-First Skill Management Platform for AI Coding Assistants**
|
|
6
|
+
|
|
7
|
+
[](https://www.npmjs.com/package/skillverse-cli)
|
|
8
|
+
[](https://opensource.org/licenses/MIT)
|
|
9
|
+
|
|
10
|
+
</div>
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## What is SkillVerse?
|
|
15
|
+
|
|
16
|
+
SkillVerse is a **local-first dashboard** for managing AI coding assistant skills (like Claude Skills, Cursor Rules, etc.). It runs on your machine, giving you full control over your skill library while providing a modern web interface.
|
|
17
|
+
|
|
18
|
+
### Key Features
|
|
19
|
+
|
|
20
|
+
- 📦 **Install skills from Git** - Clone skills directly from GitHub/GitLab
|
|
21
|
+
- 🔗 **Link to workspaces** - Create symlinks to your IDE configurations
|
|
22
|
+
- 🔄 **Update detection** - Check for updates across all your skills
|
|
23
|
+
- 🏪 **Marketplace ready** - Browse and install community skills
|
|
24
|
+
- 🔒 **Privacy first** - All data stays on your machine
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Quick Start
|
|
29
|
+
|
|
30
|
+
### Installation
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# Install globally via npm
|
|
34
|
+
npm install -g skillverse-cli
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Usage
|
|
38
|
+
|
|
39
|
+
#### 1. Install & Link Skills
|
|
40
|
+
Install skills and automatically link them to your current project's workspace (VS Code, Cursor, etc.).
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# Install from Git and link to Cursor
|
|
44
|
+
skillverse install https://github.com/my-org/my-skill --agent cursor
|
|
45
|
+
|
|
46
|
+
# Install from Git and link to VS Code
|
|
47
|
+
skillverse install https://github.com/my-org/my-skill --agent vscode
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
#### 2. Manage Local Skills
|
|
51
|
+
Develop skills locally and add them to SkillVerse.
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# Add a local skill directory and link it
|
|
55
|
+
skillverse add --path ./my-skill-dev --agent cursor
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
#### 3. List & Remove
|
|
59
|
+
Manage your installed skills.
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
# List all skills
|
|
63
|
+
skillverse list
|
|
64
|
+
|
|
65
|
+
# Remove a skill
|
|
66
|
+
skillverse remove my-skill
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
#### 4. Run the Dashboard
|
|
70
|
+
```bash
|
|
71
|
+
# Start the web UI server
|
|
72
|
+
skillverse start
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### What happens when you run `skillverse start`?
|
|
76
|
+
|
|
77
|
+
1. 🚀 A local server starts on `http://localhost:3001`
|
|
78
|
+
2. 🌐 Your default browser opens automatically
|
|
79
|
+
3. 📁 Skills are stored in `~/.skillverse/skills/`
|
|
80
|
+
4. 💾 Metadata is stored in a local SQLite database
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Architecture
|
|
85
|
+
|
|
86
|
+
SkillVerse follows the **"Local-First Dashboard"** pattern, similar to Jupyter Notebook or Prisma Studio.
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
90
|
+
│ Your Computer │
|
|
91
|
+
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │
|
|
92
|
+
│ │ Browser │◄──►│ Express │◄──►│ ~/.skillverse │ │
|
|
93
|
+
│ │ (React UI) │ │ Server │ │ (Skills DB) │ │
|
|
94
|
+
│ └─────────────┘ └─────────────┘ └─────────────────┘ │
|
|
95
|
+
└─────────────────────────────────────────────────────────────┘
|
|
96
|
+
│
|
|
97
|
+
▼
|
|
98
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
99
|
+
│ Cloud (Optional) │
|
|
100
|
+
│ ┌─────────────────────────────────────────────────────────┐│
|
|
101
|
+
│ │ Marketplace Registry (GitHub JSON / Simple API) ││
|
|
102
|
+
│ │ - Skill listings ││
|
|
103
|
+
│ │ - Git URLs ││
|
|
104
|
+
│ │ - Descriptions ││
|
|
105
|
+
│ └─────────────────────────────────────────────────────────┘│
|
|
106
|
+
└─────────────────────────────────────────────────────────────┘
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Why Local-First?
|
|
110
|
+
|
|
111
|
+
| Feature | Cloud SaaS | Local-First ✅ |
|
|
112
|
+
|---------|------------|----------------|
|
|
113
|
+
| File access | ❌ Cannot access local files | ✅ Full `~/.skillverse` access |
|
|
114
|
+
| Privacy | ⚠️ Data on remote servers | ✅ All data stays local |
|
|
115
|
+
| Offline | ❌ Requires internet | ✅ Works offline |
|
|
116
|
+
| Speed | Depends on network | ⚡ Instant |
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Marketplace Integration
|
|
121
|
+
|
|
122
|
+
The marketplace works through a simple **Registry + Client** model:
|
|
123
|
+
|
|
124
|
+
### Registry (Cloud)
|
|
125
|
+
A lightweight JSON file or API that lists available skills:
|
|
126
|
+
|
|
127
|
+
```json
|
|
128
|
+
{
|
|
129
|
+
"skills": [
|
|
130
|
+
{
|
|
131
|
+
"name": "vue-composition-api",
|
|
132
|
+
"description": "Best practices for Vue 3 Composition API",
|
|
133
|
+
"gitUrl": "https://github.com/example/vue-skill",
|
|
134
|
+
"author": "community"
|
|
135
|
+
}
|
|
136
|
+
]
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Client (Local)
|
|
141
|
+
1. User clicks **"Marketplace"** tab in the local UI
|
|
142
|
+
2. Frontend fetches skill list from registry
|
|
143
|
+
3. User clicks **"Install"**
|
|
144
|
+
4. Frontend sends `POST /api/skills/from-git` to **local backend**
|
|
145
|
+
5. Local backend runs `git clone` to `~/.skillverse/skills/`
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## Development Setup
|
|
150
|
+
|
|
151
|
+
### Prerequisites
|
|
152
|
+
|
|
153
|
+
- Node.js >= 18.0.0
|
|
154
|
+
- npm >= 9.0.0
|
|
155
|
+
|
|
156
|
+
### Local CLI Development (Testing `skillverse` command)
|
|
157
|
+
|
|
158
|
+
To test the `skillverse` command locally without publishing to npm:
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
# 1. Build everything
|
|
162
|
+
npm run build
|
|
163
|
+
|
|
164
|
+
# 2. Go to server directory
|
|
165
|
+
cd server
|
|
166
|
+
|
|
167
|
+
# 3. Link the package globally
|
|
168
|
+
# (You may need 'sudo' depending on permissions)
|
|
169
|
+
npm link
|
|
170
|
+
|
|
171
|
+
# 4. Run the command anywhere!
|
|
172
|
+
skillverse start
|
|
173
|
+
skillverse start --no-open
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Standard Development
|
|
177
|
+
```bash
|
|
178
|
+
# Clone the repository
|
|
179
|
+
git clone https://github.com/your-org/skillverse.git
|
|
180
|
+
cd skillverse
|
|
181
|
+
|
|
182
|
+
# Install dependencies
|
|
183
|
+
npm install
|
|
184
|
+
|
|
185
|
+
# Initialize database
|
|
186
|
+
cd server && npx prisma generate && npx prisma db push && cd ..
|
|
187
|
+
|
|
188
|
+
# Build all packages
|
|
189
|
+
npm run build
|
|
190
|
+
|
|
191
|
+
# Start development servers (hot-reload)
|
|
192
|
+
npm run dev
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### Project Structure
|
|
196
|
+
|
|
197
|
+
```
|
|
198
|
+
skillverse/
|
|
199
|
+
├── client/ # React frontend (Vite)
|
|
200
|
+
│ ├── src/
|
|
201
|
+
│ └── public/
|
|
202
|
+
├── server/ # Express backend + CLI
|
|
203
|
+
│ ├── src/
|
|
204
|
+
│ │ ├── bin.ts # CLI entry point
|
|
205
|
+
│ │ ├── index.ts # Server entry point
|
|
206
|
+
│ │ ├── routes/ # API routes
|
|
207
|
+
│ │ └── services/ # Business logic
|
|
208
|
+
│ ├── prisma/ # Database schema
|
|
209
|
+
│ └── public/ # Built frontend (after build)
|
|
210
|
+
└── shared/ # Shared TypeScript types
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Build Commands
|
|
214
|
+
|
|
215
|
+
| Command | Description |
|
|
216
|
+
|---------|-------------|
|
|
217
|
+
| `npm run dev` | Start development servers with hot-reload |
|
|
218
|
+
| `npm run build` | Build all packages for production |
|
|
219
|
+
| `npm run start` | Start production server |
|
|
220
|
+
| `npm run start -- --port 8080` | Start on custom port |
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## Deployment Options
|
|
225
|
+
|
|
226
|
+
### Option 1: npm Global Install (Recommended)
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
# Users install via npm
|
|
230
|
+
npm install -g skillverse-cli
|
|
231
|
+
|
|
232
|
+
# Users run
|
|
233
|
+
skillverse start
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### Option 2: Run from Source
|
|
237
|
+
|
|
238
|
+
```bash
|
|
239
|
+
git clone https://github.com/your-org/skillverse.git
|
|
240
|
+
cd skillverse
|
|
241
|
+
npm install
|
|
242
|
+
npm run build
|
|
243
|
+
npm run start
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### Option 3: Docker (Coming Soon)
|
|
247
|
+
|
|
248
|
+
```bash
|
|
249
|
+
docker run -v ~/.skillverse:/root/.skillverse -p 3001:3001 skillverse/cli
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
## API Reference
|
|
255
|
+
|
|
256
|
+
All APIs are available at `http://localhost:3001/api/`
|
|
257
|
+
|
|
258
|
+
### Skills
|
|
259
|
+
|
|
260
|
+
| Method | Endpoint | Description |
|
|
261
|
+
|--------|----------|-------------|
|
|
262
|
+
| GET | `/api/skills` | List all installed skills |
|
|
263
|
+
| GET | `/api/skills/:id` | Get skill details |
|
|
264
|
+
| POST | `/api/skills/from-git` | Install skill from Git URL |
|
|
265
|
+
| POST | `/api/skills/from-local` | Upload skill as ZIP |
|
|
266
|
+
| DELETE | `/api/skills/:id` | Delete a skill |
|
|
267
|
+
| POST | `/api/skills/:id/upgrade` | Upgrade a Git skill |
|
|
268
|
+
|
|
269
|
+
### Workspaces
|
|
270
|
+
|
|
271
|
+
| Method | Endpoint | Description |
|
|
272
|
+
|--------|----------|-------------|
|
|
273
|
+
| GET | `/api/workspaces` | List all workspaces |
|
|
274
|
+
| POST | `/api/workspaces` | Create a workspace |
|
|
275
|
+
| POST | `/api/skills/:id/link` | Link skill to workspace |
|
|
276
|
+
|
|
277
|
+
### Registry (Cloud API)
|
|
278
|
+
|
|
279
|
+
| Method | Endpoint | Description |
|
|
280
|
+
|--------|----------|-------------|
|
|
281
|
+
| POST | `/api/auth/login` | Authenticate developer |
|
|
282
|
+
| POST | `/api/publish` | Upload new skill version |
|
|
283
|
+
| GET | `/api/search` | Search marketplace skills |
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## Release Guide
|
|
288
|
+
|
|
289
|
+
### 1. How to Publish the CLI (npm)
|
|
290
|
+
This allows users to install via `npm install -g skillverse-cli`.
|
|
291
|
+
|
|
292
|
+
1. **Prepare the package**:
|
|
293
|
+
```bash
|
|
294
|
+
npm run build
|
|
295
|
+
cd server
|
|
296
|
+
```
|
|
297
|
+
2. **Login to npm**:
|
|
298
|
+
```bash
|
|
299
|
+
npm login
|
|
300
|
+
```
|
|
301
|
+
3. **Publish**:
|
|
302
|
+
```bash
|
|
303
|
+
npm publish --access public
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
### 2. How to Deploy the Marketplace (Registry Server)
|
|
307
|
+
|
|
308
|
+
To support the full **"Create -> Upload -> Publish"** workflow, you need to deploy the **SkillVerse Registry Server**.
|
|
309
|
+
|
|
310
|
+
*Note: This is a separate deployment from the CLI.*
|
|
311
|
+
|
|
312
|
+
**Role of Registry Server:**
|
|
313
|
+
- **User Accounts**: Manage developer identities.
|
|
314
|
+
- **Submission API**: Accept `skillverse publish` uploads.
|
|
315
|
+
- **Storage**: Store skill bundles (or link to Git).
|
|
316
|
+
- **Listing API**: Serve the searchable marketplace catalog.
|
|
317
|
+
|
|
318
|
+
**Deployment Steps (Docker):**
|
|
319
|
+
```bash
|
|
320
|
+
# 1. Build Registry Image
|
|
321
|
+
docker build -t skillverse/registry -f Dockerfile.registry .
|
|
322
|
+
|
|
323
|
+
# 2. Run with Database
|
|
324
|
+
docker run -d \
|
|
325
|
+
-p 3000:3000 \
|
|
326
|
+
-e DATABASE_URL="postgresql://..." \
|
|
327
|
+
-e STORAGE_TYPE="s3" \
|
|
328
|
+
skillverse/registry
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
---
|
|
332
|
+
|
|
333
|
+
## Creating & Publishing Skills
|
|
334
|
+
|
|
335
|
+
SkillVerse empowers developers to create and share their own skills.
|
|
336
|
+
|
|
337
|
+
### 1. Create a Skill
|
|
338
|
+
```bash
|
|
339
|
+
# Scaffold a new skill
|
|
340
|
+
skillverse create my-new-skill
|
|
341
|
+
|
|
342
|
+
cd my-new-skill
|
|
343
|
+
npm install
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
### 2. Develop Locally
|
|
347
|
+
Edit your skill code in `src/index.ts`. You can test it immediately in your local dashboard.
|
|
348
|
+
|
|
349
|
+
### 3. Publish to Marketplace
|
|
350
|
+
When ready to share with the team or world:
|
|
351
|
+
|
|
352
|
+
```bash
|
|
353
|
+
# Login to the Registry
|
|
354
|
+
skillverse login
|
|
355
|
+
|
|
356
|
+
# Publish
|
|
357
|
+
skillverse publish
|
|
358
|
+
```
|
|
359
|
+
> This bundles your skill and uploads it to the configured Registry Server.
|
|
360
|
+
|
|
361
|
+
---
|
|
362
|
+
|
|
363
|
+
## Contributing
|
|
364
|
+
|
|
365
|
+
Contributions are welcome! Please read our contributing guidelines before submitting PRs.
|
|
366
|
+
|
|
367
|
+
## License
|
|
368
|
+
|
|
369
|
+
MIT © SkillVerse Team
|
package/client/README.md
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# React + TypeScript + Vite
|
|
2
|
+
|
|
3
|
+
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
|
|
4
|
+
|
|
5
|
+
Currently, two official plugins are available:
|
|
6
|
+
|
|
7
|
+
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh
|
|
8
|
+
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
|
|
9
|
+
|
|
10
|
+
## React Compiler
|
|
11
|
+
|
|
12
|
+
The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation).
|
|
13
|
+
|
|
14
|
+
## Expanding the ESLint configuration
|
|
15
|
+
|
|
16
|
+
If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
|
|
17
|
+
|
|
18
|
+
```js
|
|
19
|
+
export default defineConfig([
|
|
20
|
+
globalIgnores(['dist']),
|
|
21
|
+
{
|
|
22
|
+
files: ['**/*.{ts,tsx}'],
|
|
23
|
+
extends: [
|
|
24
|
+
// Other configs...
|
|
25
|
+
|
|
26
|
+
// Remove tseslint.configs.recommended and replace with this
|
|
27
|
+
tseslint.configs.recommendedTypeChecked,
|
|
28
|
+
// Alternatively, use this for stricter rules
|
|
29
|
+
tseslint.configs.strictTypeChecked,
|
|
30
|
+
// Optionally, add this for stylistic rules
|
|
31
|
+
tseslint.configs.stylisticTypeChecked,
|
|
32
|
+
|
|
33
|
+
// Other configs...
|
|
34
|
+
],
|
|
35
|
+
languageOptions: {
|
|
36
|
+
parserOptions: {
|
|
37
|
+
project: ['./tsconfig.node.json', './tsconfig.app.json'],
|
|
38
|
+
tsconfigRootDir: import.meta.dirname,
|
|
39
|
+
},
|
|
40
|
+
// other options...
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
])
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
|
|
47
|
+
|
|
48
|
+
```js
|
|
49
|
+
// eslint.config.js
|
|
50
|
+
import reactX from 'eslint-plugin-react-x'
|
|
51
|
+
import reactDom from 'eslint-plugin-react-dom'
|
|
52
|
+
|
|
53
|
+
export default defineConfig([
|
|
54
|
+
globalIgnores(['dist']),
|
|
55
|
+
{
|
|
56
|
+
files: ['**/*.{ts,tsx}'],
|
|
57
|
+
extends: [
|
|
58
|
+
// Other configs...
|
|
59
|
+
// Enable lint rules for React
|
|
60
|
+
reactX.configs['recommended-typescript'],
|
|
61
|
+
// Enable lint rules for React DOM
|
|
62
|
+
reactDom.configs.recommended,
|
|
63
|
+
],
|
|
64
|
+
languageOptions: {
|
|
65
|
+
parserOptions: {
|
|
66
|
+
project: ['./tsconfig.node.json', './tsconfig.app.json'],
|
|
67
|
+
tsconfigRootDir: import.meta.dirname,
|
|
68
|
+
},
|
|
69
|
+
// other options...
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
])
|
|
73
|
+
```
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import js from '@eslint/js'
|
|
2
|
+
import globals from 'globals'
|
|
3
|
+
import reactHooks from 'eslint-plugin-react-hooks'
|
|
4
|
+
import reactRefresh from 'eslint-plugin-react-refresh'
|
|
5
|
+
import tseslint from 'typescript-eslint'
|
|
6
|
+
import { defineConfig, globalIgnores } from 'eslint/config'
|
|
7
|
+
|
|
8
|
+
export default defineConfig([
|
|
9
|
+
globalIgnores(['dist']),
|
|
10
|
+
{
|
|
11
|
+
files: ['**/*.{ts,tsx}'],
|
|
12
|
+
extends: [
|
|
13
|
+
js.configs.recommended,
|
|
14
|
+
tseslint.configs.recommended,
|
|
15
|
+
reactHooks.configs.flat.recommended,
|
|
16
|
+
reactRefresh.configs.vite,
|
|
17
|
+
],
|
|
18
|
+
languageOptions: {
|
|
19
|
+
ecmaVersion: 2020,
|
|
20
|
+
globals: globals.browser,
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
])
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
|
+
<title>client</title>
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<div id="root"></div>
|
|
11
|
+
<script type="module" src="/src/main.tsx"></script>
|
|
12
|
+
</body>
|
|
13
|
+
</html>
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@skillverse/client",
|
|
3
|
+
"private": true,
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"dev": "vite",
|
|
8
|
+
"build": "tsc -b && vite build",
|
|
9
|
+
"lint": "eslint .",
|
|
10
|
+
"preview": "vite preview",
|
|
11
|
+
"typecheck": "tsc --noEmit"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@skillverse/shared": "*",
|
|
15
|
+
"react": "^19.2.0",
|
|
16
|
+
"react-dom": "^19.2.0",
|
|
17
|
+
"react-router-dom": "^7.6.1",
|
|
18
|
+
"zustand": "^5.0.3",
|
|
19
|
+
"axios": "^1.7.9",
|
|
20
|
+
"lucide-react": "^0.503.0",
|
|
21
|
+
"clsx": "^2.1.1",
|
|
22
|
+
"react-dropzone": "^14.3.8"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@eslint/js": "^9.39.1",
|
|
26
|
+
"@types/node": "^24.10.1",
|
|
27
|
+
"@types/react": "^19.2.5",
|
|
28
|
+
"@types/react-dom": "^19.2.3",
|
|
29
|
+
"@vitejs/plugin-react": "^5.1.1",
|
|
30
|
+
"autoprefixer": "^10.4.20",
|
|
31
|
+
"eslint": "^9.39.1",
|
|
32
|
+
"eslint-plugin-react-hooks": "^7.0.1",
|
|
33
|
+
"eslint-plugin-react-refresh": "^0.4.24",
|
|
34
|
+
"globals": "^16.5.0",
|
|
35
|
+
"postcss": "^8.4.49",
|
|
36
|
+
"tailwindcss": "^3.4.17",
|
|
37
|
+
"typescript": "~5.9.3",
|
|
38
|
+
"typescript-eslint": "^8.46.4",
|
|
39
|
+
"vite": "^7.2.4"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#root {
|
|
2
|
+
max-width: 1280px;
|
|
3
|
+
margin: 0 auto;
|
|
4
|
+
padding: 2rem;
|
|
5
|
+
text-align: center;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.logo {
|
|
9
|
+
height: 6em;
|
|
10
|
+
padding: 1.5em;
|
|
11
|
+
will-change: filter;
|
|
12
|
+
transition: filter 300ms;
|
|
13
|
+
}
|
|
14
|
+
.logo:hover {
|
|
15
|
+
filter: drop-shadow(0 0 2em #646cffaa);
|
|
16
|
+
}
|
|
17
|
+
.logo.react:hover {
|
|
18
|
+
filter: drop-shadow(0 0 2em #61dafbaa);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
@keyframes logo-spin {
|
|
22
|
+
from {
|
|
23
|
+
transform: rotate(0deg);
|
|
24
|
+
}
|
|
25
|
+
to {
|
|
26
|
+
transform: rotate(360deg);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
31
|
+
a:nth-of-type(2) .logo {
|
|
32
|
+
animation: logo-spin infinite 20s linear;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.card {
|
|
37
|
+
padding: 2em;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.read-the-docs {
|
|
41
|
+
color: #888;
|
|
42
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { BrowserRouter, Routes, Route } from 'react-router-dom';
|
|
2
|
+
import Layout from './components/Layout';
|
|
3
|
+
import Dashboard from './pages/Dashboard';
|
|
4
|
+
import SkillLibrary from './pages/SkillLibrary';
|
|
5
|
+
import Workspaces from './pages/Workspaces';
|
|
6
|
+
import Marketplace from './pages/Marketplace';
|
|
7
|
+
import Settings from './pages/Settings';
|
|
8
|
+
import './index.css';
|
|
9
|
+
|
|
10
|
+
function App() {
|
|
11
|
+
return (
|
|
12
|
+
<BrowserRouter>
|
|
13
|
+
<Routes>
|
|
14
|
+
<Route path="/" element={<Layout />}>
|
|
15
|
+
<Route index element={<Dashboard />} />
|
|
16
|
+
<Route path="skills" element={<SkillLibrary />} />
|
|
17
|
+
<Route path="workspaces" element={<Workspaces />} />
|
|
18
|
+
<Route path="marketplace" element={<Marketplace />} />
|
|
19
|
+
<Route path="settings" element={<Settings />} />
|
|
20
|
+
</Route>
|
|
21
|
+
</Routes>
|
|
22
|
+
</BrowserRouter>
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export default App;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="35.93" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 228"><path fill="#00D8FF" d="M210.483 73.824a171.49 171.49 0 0 0-8.24-2.597c.465-1.9.893-3.777 1.273-5.621c6.238-30.281 2.16-54.676-11.769-62.708c-13.355-7.7-35.196.329-57.254 19.526a171.23 171.23 0 0 0-6.375 5.848a155.866 155.866 0 0 0-4.241-3.917C100.759 3.829 77.587-4.822 63.673 3.233C50.33 10.957 46.379 33.89 51.995 62.588a170.974 170.974 0 0 0 1.892 8.48c-3.28.932-6.445 1.924-9.474 2.98C17.309 83.498 0 98.307 0 113.668c0 15.865 18.582 31.778 46.812 41.427a145.52 145.52 0 0 0 6.921 2.165a167.467 167.467 0 0 0-2.01 9.138c-5.354 28.2-1.173 50.591 12.134 58.266c13.744 7.926 36.812-.22 59.273-19.855a145.567 145.567 0 0 0 5.342-4.923a168.064 168.064 0 0 0 6.92 6.314c21.758 18.722 43.246 26.282 56.54 18.586c13.731-7.949 18.194-32.003 12.4-61.268a145.016 145.016 0 0 0-1.535-6.842c1.62-.48 3.21-.974 4.76-1.488c29.348-9.723 48.443-25.443 48.443-41.52c0-15.417-17.868-30.326-45.517-39.844Zm-6.365 70.984c-1.4.463-2.836.91-4.3 1.345c-3.24-10.257-7.612-21.163-12.963-32.432c5.106-11 9.31-21.767 12.459-31.957c2.619.758 5.16 1.557 7.61 2.4c23.69 8.156 38.14 20.213 38.14 29.504c0 9.896-15.606 22.743-40.946 31.14Zm-10.514 20.834c2.562 12.94 2.927 24.64 1.23 33.787c-1.524 8.219-4.59 13.698-8.382 15.893c-8.067 4.67-25.32-1.4-43.927-17.412a156.726 156.726 0 0 1-6.437-5.87c7.214-7.889 14.423-17.06 21.459-27.246c12.376-1.098 24.068-2.894 34.671-5.345a134.17 134.17 0 0 1 1.386 6.193ZM87.276 214.515c-7.882 2.783-14.16 2.863-17.955.675c-8.075-4.657-11.432-22.636-6.853-46.752a156.923 156.923 0 0 1 1.869-8.499c10.486 2.32 22.093 3.988 34.498 4.994c7.084 9.967 14.501 19.128 21.976 27.15a134.668 134.668 0 0 1-4.877 4.492c-9.933 8.682-19.886 14.842-28.658 17.94ZM50.35 144.747c-12.483-4.267-22.792-9.812-29.858-15.863c-6.35-5.437-9.555-10.836-9.555-15.216c0-9.322 13.897-21.212 37.076-29.293c2.813-.98 5.757-1.905 8.812-2.773c3.204 10.42 7.406 21.315 12.477 32.332c-5.137 11.18-9.399 22.249-12.634 32.792a134.718 134.718 0 0 1-6.318-1.979Zm12.378-84.26c-4.811-24.587-1.616-43.134 6.425-47.789c8.564-4.958 27.502 2.111 47.463 19.835a144.318 144.318 0 0 1 3.841 3.545c-7.438 7.987-14.787 17.08-21.808 26.988c-12.04 1.116-23.565 2.908-34.161 5.309a160.342 160.342 0 0 1-1.76-7.887Zm110.427 27.268a347.8 347.8 0 0 0-7.785-12.803c8.168 1.033 15.994 2.404 23.343 4.08c-2.206 7.072-4.956 14.465-8.193 22.045a381.151 381.151 0 0 0-7.365-13.322Zm-45.032-43.861c5.044 5.465 10.096 11.566 15.065 18.186a322.04 322.04 0 0 0-30.257-.006c4.974-6.559 10.069-12.652 15.192-18.18ZM82.802 87.83a323.167 323.167 0 0 0-7.227 13.238c-3.184-7.553-5.909-14.98-8.134-22.152c7.304-1.634 15.093-2.97 23.209-3.984a321.524 321.524 0 0 0-7.848 12.897Zm8.081 65.352c-8.385-.936-16.291-2.203-23.593-3.793c2.26-7.3 5.045-14.885 8.298-22.6a321.187 321.187 0 0 0 7.257 13.246c2.594 4.48 5.28 8.868 8.038 13.147Zm37.542 31.03c-5.184-5.592-10.354-11.779-15.403-18.433c4.902.192 9.899.29 14.978.29c5.218 0 10.376-.117 15.453-.343c-4.985 6.774-10.018 12.97-15.028 18.486Zm52.198-57.817c3.422 7.8 6.306 15.345 8.596 22.52c-7.422 1.694-15.436 3.058-23.88 4.071a382.417 382.417 0 0 0 7.859-13.026a347.403 347.403 0 0 0 7.425-13.565Zm-16.898 8.101a358.557 358.557 0 0 1-12.281 19.815a329.4 329.4 0 0 1-23.444.823c-7.967 0-15.716-.248-23.178-.732a310.202 310.202 0 0 1-12.513-19.846h.001a307.41 307.41 0 0 1-10.923-20.627a310.278 310.278 0 0 1 10.89-20.637l-.001.001a307.318 307.318 0 0 1 12.413-19.761c7.613-.576 15.42-.876 23.31-.876H128c7.926 0 15.743.303 23.354.883a329.357 329.357 0 0 1 12.335 19.695a358.489 358.489 0 0 1 11.036 20.54a329.472 329.472 0 0 1-11 20.722Zm22.56-122.124c8.572 4.944 11.906 24.881 6.52 51.026c-.344 1.668-.73 3.367-1.15 5.09c-10.622-2.452-22.155-4.275-34.23-5.408c-7.034-10.017-14.323-19.124-21.64-27.008a160.789 160.789 0 0 1 5.888-5.4c18.9-16.447 36.564-22.941 44.612-18.3ZM128 90.808c12.625 0 22.86 10.235 22.86 22.86s-10.235 22.86-22.86 22.86s-22.86-10.235-22.86-22.86s10.235-22.86 22.86-22.86Z"></path></svg>
|