crewx 0.8.3-rc.6 → 0.8.3-rc.8

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/bin/crewx-ui.js CHANGED
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "crewx",
3
- "version": "0.8.3-rc.6",
3
+ "version": "0.8.3-rc.8",
4
4
  "description": "CrewX — AI agent team dashboard with Electron UI and CLI (Web + Electron + Global CLI)",
5
5
  "main": "server.js",
6
6
  "bin": {
@@ -24,49 +24,7 @@
24
24
  "email": "doha.park@sowonlabs.com"
25
25
  },
26
26
  "license": "UNLICENSED",
27
- "packageManager": "pnpm@9.15.0",
28
- "scripts": {
29
- "dev": "pm2 start ecosystem.dev.config.cjs",
30
- "dev:stop": "pm2 stop crewx-server crewx-ui",
31
- "dev:restart": "pm2 restart crewx-server crewx-ui",
32
- "dev:logs": "pm2 logs crewx-server crewx-ui",
33
- "dev:status": "pm2 list | grep crewx",
34
- "dev:server": "nest start --watch",
35
- "dev:ui": "vite",
36
- "dev:electron": "ELECTRON=true vite",
37
- "build:sdk": "pnpm -F @crewx/sdk run build",
38
- "db:generate": "pnpm -F @crewx/sdk run db:generate",
39
- "db:check": "pnpm -F @crewx/sdk run db:check",
40
- "build:built-in": "pnpm -r --filter './packages/built-in/*' run build",
41
- "build": "pnpm run build:sdk && pnpm run build:built-in && pnpm run build:cli && pnpm run build:server && pnpm run build:ui",
42
- "build:cli": "cd packages/cli && npm run build",
43
- "build:server": "tsc -p tsconfig.server.json && node scripts/emit-dist-server-package-json.mjs",
44
- "build:ui": "vite build",
45
- "build:web": "npm run build",
46
- "build:electron": "ELECTRON=true vite build && npm run build:server && electron-builder",
47
- "preview": "vite preview",
48
- "lint": "eslint src --ext .ts,.tsx",
49
- "test": "vitest run --config vitest.packages.config.ts && vitest run --config vitest.server.config.ts",
50
- "test:all": "vitest run && vitest run --config vitest.server.config.ts",
51
- "test:watch": "vitest",
52
- "test:ui": "vitest run",
53
- "test:server": "vitest run --config vitest.server.config.ts",
54
- "type-check": "tsc --noEmit",
55
- "build:manual": "node scripts/build-manual.mjs"
56
- },
57
27
  "dependencies": {
58
- "@ccusage/codex": "^0.0.1",
59
- "@crewx/cli": "workspace:*",
60
- "@crewx/cron": "workspace:*",
61
- "@crewx/doc": "workspace:*",
62
- "@crewx/knowledge-core": "workspace:*",
63
- "@crewx/memory": "workspace:*",
64
- "@crewx/sdk": "workspace:*",
65
- "@crewx/search": "workspace:*",
66
- "@crewx/shared": "workspace:*",
67
- "@crewx/skill": "workspace:*",
68
- "@crewx/wbs": "workspace:*",
69
- "@crewx/workflow": "workspace:*",
70
28
  "@modelcontextprotocol/sdk": "^1.0.0",
71
29
  "@nestjs/common": "^11.0.0",
72
30
  "@nestjs/config": "^4.0.3",
@@ -76,71 +34,83 @@
76
34
  "@slack/bolt": "^4.4.0",
77
35
  "@slack/web-api": "^7.10.0",
78
36
  "@sowonai/nestjs-mcp-adapter": "^0.1.3",
79
- "@tailwindcss/typography": "^0.5.19",
80
- "@tiptap/extension-link": "^3.22.4",
81
- "@tiptap/extension-mention": "^3.22.3",
82
- "@tiptap/extension-placeholder": "^3.22.3",
83
- "@tiptap/extension-table": "^3.22.3",
84
- "@tiptap/extension-table-cell": "^3.22.3",
85
- "@tiptap/extension-table-header": "^3.22.3",
86
- "@tiptap/extension-table-row": "^3.22.3",
87
- "@tiptap/react": "^3.22.3",
88
- "@tiptap/starter-kit": "^3.22.3",
89
37
  "ajv": "^8.17.1",
90
38
  "ajv-formats": "^3.0.1",
91
39
  "alasql": "^4.17.0",
92
40
  "better-sqlite3": "^12.8.0",
93
- "ccusage": "^15.2.0",
94
41
  "chalk": "^4.1.2",
95
- "chart.js": "^4.5.1",
96
- "chartjs-plugin-annotation": "^3.1.0",
97
42
  "class-transformer": "^0.5.1",
98
43
  "class-validator": "^0.15.1",
99
- "d3": "^7.9.0",
100
- "dompurify": "^3.3.3",
101
44
  "dotenv": "^17.2.3",
102
45
  "execa": "^8.0.1",
103
46
  "express": "^4.18.2",
104
47
  "fast-glob": "^3.3.0",
105
48
  "giget": "^2.0.0",
106
49
  "handlebars": "^4.7.8",
107
- "highlight.js": "^11.11.1",
108
- "i18next": "^25.8.11",
109
- "i18next-browser-languagedetector": "^8.2.1",
110
50
  "ignore": "^5.2.0",
111
51
  "isomorphic-git": "^1.37.1",
112
52
  "js-tiktoken": "^1.0.21",
113
53
  "js-yaml": "^4.1.1",
114
- "lucide-react": "^0.563.0",
115
54
  "md-to-slack": "^1.0.0",
116
- "mermaid": "^11.4.1",
117
55
  "open": "^11.0.0",
118
- "react-chartjs-2": "^5.3.1",
119
- "react-i18next": "^16.5.4",
120
- "react-markdown": "^10.1.0",
121
- "react-router-dom": "^7.13.0",
122
- "react-zoom-pan-pinch": "^3.7.0",
123
56
  "reflect-metadata": "^0.2.2",
124
- "rehype-highlight": "^7.0.2",
125
- "remark-breaks": "^4.0.0",
126
- "remark-gfm": "^4.0.1",
127
57
  "remark-parse": "^11.0.0",
128
58
  "remark-stringify": "^11.0.0",
129
59
  "rxjs": "^7.8.1",
130
60
  "swagger-ui-express": "^5.0.1",
131
- "tiptap-markdown": "^0.9.0",
132
61
  "unified": "^11.0.5",
133
62
  "unist-util-visit": "^5.0.0",
134
63
  "wink-bm25-text-search": "^3.1.2",
135
64
  "wink-nlp-utils": "^2.1.0",
136
65
  "yargs": "^17.7.0",
137
66
  "zod": "^3.22.0",
138
- "zustand": "^4.5.0"
67
+ "@crewx/cli": "0.8.3-rc.8",
68
+ "@crewx/doc": "0.1.7",
69
+ "@crewx/cron": "0.1.7",
70
+ "@crewx/knowledge-core": "0.1.5",
71
+ "@crewx/search": "0.1.8",
72
+ "@crewx/memory": "0.1.9",
73
+ "@crewx/sdk": "0.8.3-rc.5",
74
+ "@crewx/workflow": "0.3.15",
75
+ "@crewx/wbs": "0.1.8",
76
+ "@crewx/shared": "0.0.4",
77
+ "@crewx/skill": "0.1.7"
139
78
  },
140
79
  "devDependencies": {
80
+ "@ccusage/codex": "^0.0.1",
141
81
  "@nestjs/cli": "^11.0.16",
142
82
  "@nestjs/serve-static": "^4.0.2",
143
83
  "@nestjs/testing": "^11.1.16",
84
+ "@tailwindcss/typography": "^0.5.19",
85
+ "@tiptap/extension-link": "^3.22.4",
86
+ "@tiptap/extension-mention": "^3.22.3",
87
+ "@tiptap/extension-placeholder": "^3.22.3",
88
+ "@tiptap/extension-table": "^3.22.3",
89
+ "@tiptap/extension-table-cell": "^3.22.3",
90
+ "@tiptap/extension-table-header": "^3.22.3",
91
+ "@tiptap/extension-table-row": "^3.22.3",
92
+ "@tiptap/react": "^3.22.3",
93
+ "@tiptap/starter-kit": "^3.22.3",
94
+ "ccusage": "^15.2.0",
95
+ "chart.js": "^4.5.1",
96
+ "chartjs-plugin-annotation": "^3.1.0",
97
+ "d3": "^7.9.0",
98
+ "dompurify": "^3.3.3",
99
+ "highlight.js": "^11.11.1",
100
+ "i18next": "^25.8.11",
101
+ "i18next-browser-languagedetector": "^8.2.1",
102
+ "lucide-react": "^0.563.0",
103
+ "mermaid": "^11.4.1",
104
+ "react-chartjs-2": "^5.3.1",
105
+ "react-i18next": "^16.5.4",
106
+ "react-markdown": "^10.1.0",
107
+ "react-router-dom": "^7.13.0",
108
+ "react-zoom-pan-pinch": "^3.7.0",
109
+ "rehype-highlight": "^7.0.2",
110
+ "remark-breaks": "^4.0.0",
111
+ "remark-gfm": "^4.0.1",
112
+ "tiptap-markdown": "^0.9.0",
113
+ "zustand": "^4.5.0",
144
114
  "@swc-node/register": "^1.11.1",
145
115
  "@swc/core": "^1.15.11",
146
116
  "@testing-library/dom": "^10.4.1",
@@ -213,5 +183,34 @@
213
183
  "portable"
214
184
  ]
215
185
  }
186
+ },
187
+ "scripts": {
188
+ "dev": "pm2 start ecosystem.dev.config.cjs",
189
+ "dev:stop": "pm2 stop crewx-server crewx-ui",
190
+ "dev:restart": "pm2 restart crewx-server crewx-ui",
191
+ "dev:logs": "pm2 logs crewx-server crewx-ui",
192
+ "dev:status": "pm2 list | grep crewx",
193
+ "dev:server": "nest start --watch",
194
+ "dev:ui": "vite",
195
+ "dev:electron": "ELECTRON=true vite",
196
+ "build:sdk": "pnpm -F @crewx/sdk run build",
197
+ "db:generate": "pnpm -F @crewx/sdk run db:generate",
198
+ "db:check": "pnpm -F @crewx/sdk run db:check",
199
+ "build:built-in": "pnpm -r --filter './packages/built-in/*' run build",
200
+ "build": "pnpm run build:sdk && pnpm run build:built-in && pnpm run build:cli && pnpm run build:server && pnpm run build:ui",
201
+ "build:cli": "cd packages/cli && npm run build",
202
+ "build:server": "tsc -p tsconfig.server.json && node scripts/emit-dist-server-package-json.mjs",
203
+ "build:ui": "vite build",
204
+ "build:web": "npm run build",
205
+ "build:electron": "ELECTRON=true vite build && npm run build:server && electron-builder",
206
+ "preview": "vite preview",
207
+ "lint": "eslint src --ext .ts,.tsx",
208
+ "test": "vitest run --config vitest.packages.config.ts && vitest run --config vitest.server.config.ts",
209
+ "test:all": "vitest run && vitest run --config vitest.server.config.ts",
210
+ "test:watch": "vitest",
211
+ "test:ui": "vitest run",
212
+ "test:server": "vitest run --config vitest.server.config.ts",
213
+ "type-check": "tsc --noEmit",
214
+ "build:manual": "node scripts/build-manual.mjs"
216
215
  }
217
- }
216
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crewx/cli",
3
- "version": "0.8.3-rc.6",
3
+ "version": "0.8.3-rc.8",
4
4
  "license": "UNLICENSED",
5
5
  "engines": {
6
6
  "node": ">=20.19.0"
@@ -1,124 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- // @vitest-environment node
7
- const vitest_1 = require("vitest");
8
- const testing_1 = require("@nestjs/testing");
9
- const common_1 = require("@nestjs/common");
10
- const express_1 = __importDefault(require("express"));
11
- const supertest_1 = __importDefault(require("supertest"));
12
- const fs_1 = require("fs");
13
- const path_1 = require("path");
14
- const os_1 = require("os");
15
- const app_module_js_1 = require("../../app.module.js");
16
- const VALID_PATH = 'docs/test-save.md';
17
- const VALID_CONTENT = '# Hello World';
18
- let testWorkspace;
19
- function makeTempWorkspace() {
20
- const dir = (0, path_1.join)((0, os_1.tmpdir)(), `doc-e2e-${Date.now()}-${Math.random().toString(36).slice(2)}`);
21
- (0, fs_1.mkdirSync)(dir, { recursive: true });
22
- (0, fs_1.mkdirSync)((0, path_1.join)(dir, 'docs'), { recursive: true });
23
- (0, fs_1.mkdirSync)((0, path_1.join)(dir, 'skills'), { recursive: true });
24
- return dir;
25
- }
26
- (0, vitest_1.describe)('DOC.SAVE (PUT /api/v1/docs/content) e2e', () => {
27
- let app;
28
- (0, vitest_1.beforeAll)(async () => {
29
- testWorkspace = makeTempWorkspace();
30
- process.env.CREWX_WORKSPACE = testWorkspace;
31
- const module = await testing_1.Test.createTestingModule({ imports: [app_module_js_1.AppModule] }).compile();
32
- app = module.createNestApplication();
33
- app.use((req, res, next) => {
34
- if (req.url.startsWith('/adapters/')) {
35
- return next();
36
- }
37
- return express_1.default.json({ limit: '5mb' })(req, res, next);
38
- });
39
- app.useGlobalPipes(new common_1.ValidationPipe({ whitelist: true, transform: true }));
40
- app.setGlobalPrefix('api/v1', { exclude: ['mcp', 'mcp/health'] });
41
- await app.init();
42
- });
43
- (0, vitest_1.afterAll)(async () => {
44
- await app.close();
45
- delete process.env.CREWX_WORKSPACE;
46
- if ((0, fs_1.existsSync)(testWorkspace)) {
47
- (0, fs_1.rmSync)(testWorkspace, { recursive: true, force: true });
48
- }
49
- });
50
- (0, vitest_1.beforeEach)(() => {
51
- const filePath = (0, path_1.join)(testWorkspace, VALID_PATH);
52
- (0, fs_1.mkdirSync)((0, path_1.join)(testWorkspace, 'docs'), { recursive: true });
53
- (0, fs_1.writeFileSync)(filePath, VALID_CONTENT, 'utf-8');
54
- });
55
- (0, vitest_1.afterEach)(() => {
56
- const filePath = (0, path_1.join)(testWorkspace, VALID_PATH);
57
- if ((0, fs_1.existsSync)(filePath)) {
58
- (0, fs_1.rmSync)(filePath, { force: true });
59
- }
60
- });
61
- (0, vitest_1.it)('returns 200 on successful save', async () => {
62
- const filePath = (0, path_1.join)(testWorkspace, VALID_PATH);
63
- const mtime = (0, fs_1.statSync)(filePath).mtimeMs;
64
- const res = await (0, supertest_1.default)(app.getHttpServer())
65
- .put('/api/v1/docs/content')
66
- .send({ path: VALID_PATH, content: '# Updated', mtime });
67
- (0, vitest_1.expect)(res.status).toBe(200);
68
- (0, vitest_1.expect)(res.body.success).toBe(true);
69
- (0, vitest_1.expect)(res.body.data.path).toBe(VALID_PATH);
70
- (0, vitest_1.expect)(typeof res.body.data.mtime).toBe('number');
71
- });
72
- (0, vitest_1.it)('returns 409 on mtime mismatch', async () => {
73
- const staleMtime = 0;
74
- const res = await (0, supertest_1.default)(app.getHttpServer())
75
- .put('/api/v1/docs/content')
76
- .send({ path: VALID_PATH, content: '# Conflict', mtime: staleMtime });
77
- (0, vitest_1.expect)(res.status).toBe(409);
78
- (0, vitest_1.expect)(res.body.error).toBe('CONFLICT');
79
- });
80
- (0, vitest_1.it)('returns 400 on path traversal', async () => {
81
- const res = await (0, supertest_1.default)(app.getHttpServer())
82
- .put('/api/v1/docs/content')
83
- .send({ path: '../../etc/passwd', content: 'hacked', mtime: 0 });
84
- (0, vitest_1.expect)(res.status).toBe(400);
85
- (0, vitest_1.expect)(res.body.message).toContain('Path traversal');
86
- });
87
- (0, vitest_1.it)('returns 400 on .ts extension', async () => {
88
- const tsPath = (0, path_1.join)(testWorkspace, 'src', 'index.ts');
89
- (0, fs_1.mkdirSync)((0, path_1.join)(testWorkspace, 'src'), { recursive: true });
90
- (0, fs_1.writeFileSync)(tsPath, 'console.log("hi")', 'utf-8');
91
- const res = await (0, supertest_1.default)(app.getHttpServer())
92
- .put('/api/v1/docs/content')
93
- .send({ path: 'src/index.ts', content: 'new code', mtime: 0 });
94
- (0, vitest_1.expect)(res.status).toBe(400);
95
- (0, vitest_1.expect)(res.body.message).toContain('.md');
96
- (0, fs_1.rmSync)(tsPath, { force: true });
97
- });
98
- (0, vitest_1.it)('returns 400 on content exceeding 2MB', async () => {
99
- const filePath = (0, path_1.join)(testWorkspace, VALID_PATH);
100
- const mtime = (0, fs_1.statSync)(filePath).mtimeMs;
101
- const bigContent = 'x'.repeat(2 * 1024 * 1024 + 1);
102
- const res = await (0, supertest_1.default)(app.getHttpServer())
103
- .put('/api/v1/docs/content')
104
- .send({ path: VALID_PATH, content: bigContent, mtime });
105
- (0, vitest_1.expect)(res.status).toBe(400);
106
- (0, vitest_1.expect)(res.body.message).toContain('2MB');
107
- });
108
- (0, vitest_1.it)('returns 400 on empty content', async () => {
109
- const filePath = (0, path_1.join)(testWorkspace, VALID_PATH);
110
- const mtime = (0, fs_1.statSync)(filePath).mtimeMs;
111
- const res = await (0, supertest_1.default)(app.getHttpServer())
112
- .put('/api/v1/docs/content')
113
- .send({ path: VALID_PATH, content: '', mtime });
114
- (0, vitest_1.expect)(res.status).toBe(400);
115
- (0, vitest_1.expect)(res.body.message).toContain('Empty content');
116
- });
117
- (0, vitest_1.it)('returns 400 when body is missing (DTO empty)', async () => {
118
- const res = await (0, supertest_1.default)(app.getHttpServer())
119
- .put('/api/v1/docs/content')
120
- .send({})
121
- .set('Content-Type', 'application/json');
122
- (0, vitest_1.expect)(res.status).toBe(400);
123
- });
124
- });