@kmlckj/licos-ai-cli 1.1.28 → 1.1.30
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/lib/__templates__/agent/pyproject.toml +1 -1
- package/lib/__templates__/expo/.licosproj/scripts/dev_run.sh +21 -1
- package/lib/__templates__/expo/pnpm-lock.yaml +5 -5
- package/lib/__templates__/expo/server/package.json +1 -1
- package/lib/__templates__/nextjs/package.json +1 -1
- package/lib/__templates__/nextjs/pnpm-lock.yaml +5 -5
- package/lib/__templates__/nextjs/scripts/dev.sh +8 -10
- package/lib/__templates__/nuxt-vue/nuxt.config.ts +181 -180
- package/lib/__templates__/nuxt-vue/package.json +1 -1
- package/lib/__templates__/nuxt-vue/pnpm-lock.yaml +5 -5
- package/lib/__templates__/nuxt-vue/scripts/dev.sh +8 -10
- package/lib/__templates__/taro/.licosproj/scripts/dev_run.sh +2 -1
- package/lib/__templates__/taro/pnpm-lock.yaml +5 -5
- package/lib/__templates__/taro/server/package.json +1 -1
- package/lib/__templates__/vite/package.json +1 -1
- package/lib/__templates__/vite/pnpm-lock.yaml +5 -5
- package/lib/__templates__/vite/scripts/dev.sh +8 -10
- package/lib/__templates__/vite/vite.config.ts +65 -64
- package/lib/__templates__/workflow/pyproject.toml +1 -1
- package/package.json +1 -1
|
@@ -88,6 +88,26 @@ ensure_port() {
|
|
|
88
88
|
fi
|
|
89
89
|
fi
|
|
90
90
|
}
|
|
91
|
+
ensure_fixed_preview_port() {
|
|
92
|
+
local port_val=$1
|
|
93
|
+
if is_port_free "$port_val"; then
|
|
94
|
+
echo "预览端口未占用:$port_val"
|
|
95
|
+
return 0
|
|
96
|
+
fi
|
|
97
|
+
|
|
98
|
+
echo "预览端口已占用:$port_val,正在清理旧进程"
|
|
99
|
+
if ! command -v fuser >/dev/null 2>&1; then
|
|
100
|
+
echo "无法清理预览端口 $port_val:缺少 fuser。LICOS 预览不会切换到其他端口。"
|
|
101
|
+
exit 1
|
|
102
|
+
fi
|
|
103
|
+
fuser -k "${port_val}/tcp" 2>/dev/null || true
|
|
104
|
+
sleep 1
|
|
105
|
+
if ! is_port_free "$port_val"; then
|
|
106
|
+
echo "预览端口 $port_val 清理失败。LICOS 预览不会切换到其他端口。"
|
|
107
|
+
exit 1
|
|
108
|
+
fi
|
|
109
|
+
echo "预览端口已清理:$port_val"
|
|
110
|
+
}
|
|
91
111
|
configure_expo_env() {
|
|
92
112
|
local web_url="${LICOS_PROJECT_DOMAIN_DEFAULT:-http://127.0.0.1:${SERVER_PORT}}"
|
|
93
113
|
EXPO_PUBLIC_BACKEND_BASE_URL="${EXPO_PUBLIC_BACKEND_BASE_URL:-$web_url}"
|
|
@@ -181,7 +201,7 @@ check_command "bash"
|
|
|
181
201
|
|
|
182
202
|
# 端口占用预检查与处理
|
|
183
203
|
ensure_port SERVER_PORT "$SERVER_PORT"
|
|
184
|
-
|
|
204
|
+
ensure_fixed_preview_port "$EXPO_PORT"
|
|
185
205
|
configure_expo_env
|
|
186
206
|
|
|
187
207
|
echo "==================== 启动 server 服务 ===================="
|
|
@@ -266,8 +266,8 @@ importers:
|
|
|
266
266
|
server:
|
|
267
267
|
dependencies:
|
|
268
268
|
'@kmlckj/licos-dev-sdk':
|
|
269
|
-
specifier: 0.2.
|
|
270
|
-
version: 0.2.
|
|
269
|
+
specifier: 0.2.16
|
|
270
|
+
version: 0.2.16
|
|
271
271
|
'@kmlckj/licos-platform-sdk':
|
|
272
272
|
specifier: 0.10.3
|
|
273
273
|
version: 0.10.3
|
|
@@ -1324,8 +1324,8 @@ packages:
|
|
|
1324
1324
|
'@jridgewell/trace-mapping@0.3.31':
|
|
1325
1325
|
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
|
|
1326
1326
|
|
|
1327
|
-
'@kmlckj/licos-dev-sdk@0.2.
|
|
1328
|
-
resolution: {integrity: sha512-
|
|
1327
|
+
'@kmlckj/licos-dev-sdk@0.2.16':
|
|
1328
|
+
resolution: {integrity: sha512-F2nJH0ODLaNCyujaDflFm5iBL4YxJxnnWKC6Rvy6MXF8Z01yhvq1q0EUveF1LYzeaQH3yl6j1W50Gp8nBdSoRQ==}
|
|
1329
1329
|
engines: {node: '>=18'}
|
|
1330
1330
|
|
|
1331
1331
|
'@kmlckj/licos-platform-sdk@0.10.3':
|
|
@@ -7493,7 +7493,7 @@ snapshots:
|
|
|
7493
7493
|
'@jridgewell/resolve-uri': 3.1.2
|
|
7494
7494
|
'@jridgewell/sourcemap-codec': 1.5.5
|
|
7495
7495
|
|
|
7496
|
-
'@kmlckj/licos-dev-sdk@0.2.
|
|
7496
|
+
'@kmlckj/licos-dev-sdk@0.2.16': {}
|
|
7497
7497
|
|
|
7498
7498
|
'@kmlckj/licos-platform-sdk@0.10.3':
|
|
7499
7499
|
dependencies:
|
|
@@ -18,8 +18,8 @@ importers:
|
|
|
18
18
|
specifier: ^5.2.2
|
|
19
19
|
version: 5.4.0(react-hook-form@7.77.0(react@19.2.3))
|
|
20
20
|
'@kmlckj/licos-dev-sdk':
|
|
21
|
-
specifier: 0.2.
|
|
22
|
-
version: 0.2.
|
|
21
|
+
specifier: 0.2.16
|
|
22
|
+
version: 0.2.16
|
|
23
23
|
'@kmlckj/licos-platform-sdk':
|
|
24
24
|
specifier: 0.10.3
|
|
25
25
|
version: 0.10.3
|
|
@@ -1380,8 +1380,8 @@ packages:
|
|
|
1380
1380
|
'@jridgewell/trace-mapping@0.3.31':
|
|
1381
1381
|
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
|
|
1382
1382
|
|
|
1383
|
-
'@kmlckj/licos-dev-sdk@0.2.
|
|
1384
|
-
resolution: {integrity: sha512-
|
|
1383
|
+
'@kmlckj/licos-dev-sdk@0.2.16':
|
|
1384
|
+
resolution: {integrity: sha512-F2nJH0ODLaNCyujaDflFm5iBL4YxJxnnWKC6Rvy6MXF8Z01yhvq1q0EUveF1LYzeaQH3yl6j1W50Gp8nBdSoRQ==}
|
|
1385
1385
|
engines: {node: '>=18'}
|
|
1386
1386
|
|
|
1387
1387
|
'@kmlckj/licos-platform-sdk@0.10.3':
|
|
@@ -6707,7 +6707,7 @@ snapshots:
|
|
|
6707
6707
|
'@jridgewell/resolve-uri': 3.1.2
|
|
6708
6708
|
'@jridgewell/sourcemap-codec': 1.5.5
|
|
6709
6709
|
|
|
6710
|
-
'@kmlckj/licos-dev-sdk@0.2.
|
|
6710
|
+
'@kmlckj/licos-dev-sdk@0.2.16': {}
|
|
6711
6711
|
|
|
6712
6712
|
'@kmlckj/licos-platform-sdk@0.10.3':
|
|
6713
6713
|
dependencies:
|
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
set -Eeuo pipefail
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
if [[ -n "${LICOS_RUN_PORT:-}" ]]; then
|
|
5
|
+
PORT="${LICOS_RUN_PORT}"
|
|
6
|
+
elif [[ -z "${PORT:-}" ]]; then
|
|
7
|
+
PORT=<%= port %>
|
|
8
|
+
fi
|
|
7
9
|
PROJECT_DIR="${LICOS_PROJECT_PATH:-${LICOS_WORKSPACE_PATH:-$(pwd)}}"
|
|
8
|
-
DEPLOY_RUN_PORT="${
|
|
9
|
-
<% } else { %>
|
|
10
|
-
PORT=<%= port %>
|
|
11
|
-
PROJECT_DIR="${LICOS_PROJECT_PATH:-${LICOS_WORKSPACE_PATH:-$(pwd)}}"
|
|
12
|
-
DEPLOY_RUN_PORT=<%= port %>
|
|
13
|
-
<% } %>
|
|
10
|
+
DEPLOY_RUN_PORT="${PORT}"
|
|
14
11
|
|
|
15
12
|
cd "${PROJECT_DIR}"
|
|
16
13
|
|
|
@@ -26,7 +23,8 @@ kill_port_if_listening() {
|
|
|
26
23
|
sleep 1
|
|
27
24
|
pids=$(ss -H -lntp 2>/dev/null | awk -v port="${DEPLOY_RUN_PORT}" '$4 ~ ":"port"$"' | grep -o 'pid=[0-9]*' | cut -d= -f2 | paste -sd' ' - || true)
|
|
28
25
|
if [[ -n "${pids}" ]]; then
|
|
29
|
-
echo "
|
|
26
|
+
echo "Preview port ${DEPLOY_RUN_PORT} is still busy after cleanup, PIDs: ${pids}. Refusing to use another port."
|
|
27
|
+
exit 1
|
|
30
28
|
else
|
|
31
29
|
echo "Port ${DEPLOY_RUN_PORT} cleared."
|
|
32
30
|
fi
|
|
@@ -1,180 +1,181 @@
|
|
|
1
|
-
// https://nuxt.com/docs/api/configuration/nuxt-config
|
|
2
|
-
import { fileURLToPath } from 'url';
|
|
3
|
-
import { dirname, resolve } from 'path';
|
|
4
|
-
|
|
5
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
-
const __dirname = dirname(__filename);
|
|
7
|
-
|
|
8
|
-
function normalizeBaseURL(value?: string): string {
|
|
9
|
-
const trimmed = value?.trim();
|
|
10
|
-
if (!trimmed || trimmed === '/') return '/';
|
|
11
|
-
return `/${trimmed.replace(/^\/+|\/+$/g, '')}/`;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
function parsePort(value?: string): number | undefined {
|
|
15
|
-
const port = Number.parseInt(value || '', 10);
|
|
16
|
-
return Number.isInteger(port) && port > 0 ? port : undefined;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
function createPreviewHmrConfig() {
|
|
20
|
-
if (!process.env.LICOS_PREVIEW_BASE_PATH) {
|
|
21
|
-
return undefined;
|
|
22
|
-
}
|
|
23
|
-
const hmr: Record<string, unknown> = {
|
|
24
|
-
overlay: true,
|
|
25
|
-
path: process.env.LICOS_PREVIEW_HMR_PATH || '/hot/vite-hmr',
|
|
26
|
-
timeout: 30000,
|
|
27
|
-
};
|
|
28
|
-
if (process.env.LICOS_PREVIEW_HMR_HOST) {
|
|
29
|
-
hmr.host = process.env.LICOS_PREVIEW_HMR_HOST;
|
|
30
|
-
}
|
|
31
|
-
if (process.env.LICOS_PREVIEW_HMR_PROTOCOL) {
|
|
32
|
-
hmr.protocol = process.env.LICOS_PREVIEW_HMR_PROTOCOL;
|
|
33
|
-
}
|
|
34
|
-
const clientPort = parsePort(process.env.LICOS_PREVIEW_HMR_CLIENT_PORT);
|
|
35
|
-
if (clientPort) {
|
|
36
|
-
hmr.clientPort = clientPort;
|
|
37
|
-
}
|
|
38
|
-
return hmr;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
function isProdProjectEnv(value?: string): boolean {
|
|
42
|
-
const normalized = value?.trim().toLowerCase();
|
|
43
|
-
return normalized === 'prod' || normalized === 'production' || normalized === 'release';
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const isProd = isProdProjectEnv(process.env.LICOS_PROJECT_ENV);
|
|
47
|
-
const deployBaseURL = process.env.NUXT_PUBLIC_BASE_URL || process.env.BASE_PATH;
|
|
48
|
-
const shouldUseBaseURL = Boolean(deployBaseURL) || isProd;
|
|
49
|
-
|
|
50
|
-
const publicBaseURL = shouldUseBaseURL ? normalizeBaseURL(deployBaseURL) : '/';
|
|
51
|
-
const publicAssetCdnURL = publicBaseURL === '/' ? '' : publicBaseURL.replace(/\/$/, '');
|
|
52
|
-
const previewHmrConfig = createPreviewHmrConfig();
|
|
53
|
-
|
|
54
|
-
export default defineNuxtConfig({
|
|
55
|
-
compatibilityDate: '2025-07-15',
|
|
56
|
-
// Disable devtools in CI/test environments (prevents hanging in headless mode)
|
|
57
|
-
devtools: {
|
|
58
|
-
enabled: process.env.CI !== 'true' && !isProd,
|
|
59
|
-
},
|
|
60
|
-
telemetry: false,
|
|
61
|
-
|
|
62
|
-
// App head configuration
|
|
63
|
-
app: {
|
|
64
|
-
// The cluster ingress rewrites /p/{projectId}/... to backend /...
|
|
65
|
-
// Keep Nuxt's server asset route at /_nuxt and prefix browser URLs via cdnURL.
|
|
66
|
-
baseURL: '/',
|
|
67
|
-
buildAssetsDir: '/_nuxt/',
|
|
68
|
-
cdnURL: publicAssetCdnURL,
|
|
69
|
-
head: {
|
|
70
|
-
title: '新应用 | LICOS AI',
|
|
71
|
-
titleTemplate: '%s | LICOS AI',
|
|
72
|
-
meta: [
|
|
73
|
-
{ charset: 'utf-8' },
|
|
74
|
-
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
|
|
75
|
-
{
|
|
76
|
-
name: 'description',
|
|
77
|
-
content:
|
|
78
|
-
'LICOS AI是一款一站式云端 Vibe Coding 开发平台。通过对话轻松构建智能体、工作流和网站,实现从创意到上线的无缝衔接。',
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
name: 'keywords',
|
|
82
|
-
content:
|
|
83
|
-
'LICOS AI,LICOS AI,Vibe Coding,AI 编程,智能体搭建,工作流搭建,网站搭建,网站部署,全栈开发,AI 工程师',
|
|
84
|
-
},
|
|
85
|
-
{ name: 'author', content: 'LICOS Team' },
|
|
86
|
-
{ name: 'generator', content: 'LICOS AI' },
|
|
87
|
-
// Open Graph
|
|
88
|
-
{ property: 'og:title', content: 'LICOS AI | 你的 AI 工程师已就位' },
|
|
89
|
-
{
|
|
90
|
-
property: 'og:description',
|
|
91
|
-
content:
|
|
92
|
-
'我正在使用LICOS AI Vibe Coding,让创意瞬间上线。告别拖拽,拥抱心流。',
|
|
93
|
-
},
|
|
94
|
-
{ property: 'og:url', content: 'https://licos.ai' },
|
|
95
|
-
{ property: 'og:site_name', content: 'LICOS AI' },
|
|
96
|
-
{ property: 'og:locale', content: 'zh_CN' },
|
|
97
|
-
{ property: 'og:type', content: 'website' },
|
|
98
|
-
// Robots
|
|
99
|
-
{ name: 'robots', content: 'index, follow' },
|
|
100
|
-
],
|
|
101
|
-
link: [{ rel: 'canonical', href: 'https://licos.ai' }],
|
|
102
|
-
htmlAttrs: {
|
|
103
|
-
lang: 'zh-CN',
|
|
104
|
-
},
|
|
105
|
-
},
|
|
106
|
-
},
|
|
107
|
-
|
|
108
|
-
// Nuxt modules
|
|
109
|
-
modules: ['@nuxt/image', '@nuxtjs/tailwindcss'],
|
|
110
|
-
|
|
111
|
-
// Global CSS
|
|
112
|
-
css: [resolve(__dirname, 'assets/css/main.css')],
|
|
113
|
-
|
|
114
|
-
runtimeConfig: {
|
|
115
|
-
public: {
|
|
116
|
-
baseURL: publicBaseURL,
|
|
117
|
-
},
|
|
118
|
-
},
|
|
119
|
-
|
|
120
|
-
// Development server configuration
|
|
121
|
-
devServer: {
|
|
122
|
-
port: parseInt(process.env.PORT || '<%= port %>', 10),
|
|
123
|
-
host: process.env.HOST || '0.0.0.0',
|
|
124
|
-
},
|
|
125
|
-
|
|
126
|
-
// TypeScript configuration
|
|
127
|
-
typescript: {
|
|
128
|
-
strict: false,
|
|
129
|
-
typeCheck: false,
|
|
130
|
-
},
|
|
131
|
-
|
|
132
|
-
// Vite configuration (similar to Next.js allowedDevOrigins)
|
|
133
|
-
vite: {
|
|
134
|
-
server: {
|
|
135
|
-
host: '0.0.0.0',
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
//
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
'
|
|
153
|
-
'**/.
|
|
154
|
-
'
|
|
155
|
-
'
|
|
156
|
-
'
|
|
157
|
-
'
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
}
|
|
1
|
+
// https://nuxt.com/docs/api/configuration/nuxt-config
|
|
2
|
+
import { fileURLToPath } from 'url';
|
|
3
|
+
import { dirname, resolve } from 'path';
|
|
4
|
+
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = dirname(__filename);
|
|
7
|
+
|
|
8
|
+
function normalizeBaseURL(value?: string): string {
|
|
9
|
+
const trimmed = value?.trim();
|
|
10
|
+
if (!trimmed || trimmed === '/') return '/';
|
|
11
|
+
return `/${trimmed.replace(/^\/+|\/+$/g, '')}/`;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function parsePort(value?: string): number | undefined {
|
|
15
|
+
const port = Number.parseInt(value || '', 10);
|
|
16
|
+
return Number.isInteger(port) && port > 0 ? port : undefined;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function createPreviewHmrConfig() {
|
|
20
|
+
if (!process.env.LICOS_PREVIEW_BASE_PATH) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
const hmr: Record<string, unknown> = {
|
|
24
|
+
overlay: true,
|
|
25
|
+
path: process.env.LICOS_PREVIEW_HMR_PATH || '/hot/vite-hmr',
|
|
26
|
+
timeout: 30000,
|
|
27
|
+
};
|
|
28
|
+
if (process.env.LICOS_PREVIEW_HMR_HOST) {
|
|
29
|
+
hmr.host = process.env.LICOS_PREVIEW_HMR_HOST;
|
|
30
|
+
}
|
|
31
|
+
if (process.env.LICOS_PREVIEW_HMR_PROTOCOL) {
|
|
32
|
+
hmr.protocol = process.env.LICOS_PREVIEW_HMR_PROTOCOL;
|
|
33
|
+
}
|
|
34
|
+
const clientPort = parsePort(process.env.LICOS_PREVIEW_HMR_CLIENT_PORT);
|
|
35
|
+
if (clientPort) {
|
|
36
|
+
hmr.clientPort = clientPort;
|
|
37
|
+
}
|
|
38
|
+
return hmr;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function isProdProjectEnv(value?: string): boolean {
|
|
42
|
+
const normalized = value?.trim().toLowerCase();
|
|
43
|
+
return normalized === 'prod' || normalized === 'production' || normalized === 'release';
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const isProd = isProdProjectEnv(process.env.LICOS_PROJECT_ENV);
|
|
47
|
+
const deployBaseURL = process.env.NUXT_PUBLIC_BASE_URL || process.env.BASE_PATH;
|
|
48
|
+
const shouldUseBaseURL = Boolean(deployBaseURL) || isProd;
|
|
49
|
+
|
|
50
|
+
const publicBaseURL = shouldUseBaseURL ? normalizeBaseURL(deployBaseURL) : '/';
|
|
51
|
+
const publicAssetCdnURL = publicBaseURL === '/' ? '' : publicBaseURL.replace(/\/$/, '');
|
|
52
|
+
const previewHmrConfig = createPreviewHmrConfig();
|
|
53
|
+
|
|
54
|
+
export default defineNuxtConfig({
|
|
55
|
+
compatibilityDate: '2025-07-15',
|
|
56
|
+
// Disable devtools in CI/test environments (prevents hanging in headless mode)
|
|
57
|
+
devtools: {
|
|
58
|
+
enabled: process.env.CI !== 'true' && !isProd,
|
|
59
|
+
},
|
|
60
|
+
telemetry: false,
|
|
61
|
+
|
|
62
|
+
// App head configuration
|
|
63
|
+
app: {
|
|
64
|
+
// The cluster ingress rewrites /p/{projectId}/... to backend /...
|
|
65
|
+
// Keep Nuxt's server asset route at /_nuxt and prefix browser URLs via cdnURL.
|
|
66
|
+
baseURL: '/',
|
|
67
|
+
buildAssetsDir: '/_nuxt/',
|
|
68
|
+
cdnURL: publicAssetCdnURL,
|
|
69
|
+
head: {
|
|
70
|
+
title: '新应用 | LICOS AI',
|
|
71
|
+
titleTemplate: '%s | LICOS AI',
|
|
72
|
+
meta: [
|
|
73
|
+
{ charset: 'utf-8' },
|
|
74
|
+
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
|
|
75
|
+
{
|
|
76
|
+
name: 'description',
|
|
77
|
+
content:
|
|
78
|
+
'LICOS AI是一款一站式云端 Vibe Coding 开发平台。通过对话轻松构建智能体、工作流和网站,实现从创意到上线的无缝衔接。',
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: 'keywords',
|
|
82
|
+
content:
|
|
83
|
+
'LICOS AI,LICOS AI,Vibe Coding,AI 编程,智能体搭建,工作流搭建,网站搭建,网站部署,全栈开发,AI 工程师',
|
|
84
|
+
},
|
|
85
|
+
{ name: 'author', content: 'LICOS Team' },
|
|
86
|
+
{ name: 'generator', content: 'LICOS AI' },
|
|
87
|
+
// Open Graph
|
|
88
|
+
{ property: 'og:title', content: 'LICOS AI | 你的 AI 工程师已就位' },
|
|
89
|
+
{
|
|
90
|
+
property: 'og:description',
|
|
91
|
+
content:
|
|
92
|
+
'我正在使用LICOS AI Vibe Coding,让创意瞬间上线。告别拖拽,拥抱心流。',
|
|
93
|
+
},
|
|
94
|
+
{ property: 'og:url', content: 'https://licos.ai' },
|
|
95
|
+
{ property: 'og:site_name', content: 'LICOS AI' },
|
|
96
|
+
{ property: 'og:locale', content: 'zh_CN' },
|
|
97
|
+
{ property: 'og:type', content: 'website' },
|
|
98
|
+
// Robots
|
|
99
|
+
{ name: 'robots', content: 'index, follow' },
|
|
100
|
+
],
|
|
101
|
+
link: [{ rel: 'canonical', href: 'https://licos.ai' }],
|
|
102
|
+
htmlAttrs: {
|
|
103
|
+
lang: 'zh-CN',
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
|
|
108
|
+
// Nuxt modules
|
|
109
|
+
modules: ['@nuxt/image', '@nuxtjs/tailwindcss'],
|
|
110
|
+
|
|
111
|
+
// Global CSS
|
|
112
|
+
css: [resolve(__dirname, 'assets/css/main.css')],
|
|
113
|
+
|
|
114
|
+
runtimeConfig: {
|
|
115
|
+
public: {
|
|
116
|
+
baseURL: publicBaseURL,
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
|
|
120
|
+
// Development server configuration
|
|
121
|
+
devServer: {
|
|
122
|
+
port: parseInt(process.env.PORT || '<%= port %>', 10),
|
|
123
|
+
host: process.env.HOST || '0.0.0.0',
|
|
124
|
+
},
|
|
125
|
+
|
|
126
|
+
// TypeScript configuration
|
|
127
|
+
typescript: {
|
|
128
|
+
strict: false,
|
|
129
|
+
typeCheck: false,
|
|
130
|
+
},
|
|
131
|
+
|
|
132
|
+
// Vite configuration (similar to Next.js allowedDevOrigins)
|
|
133
|
+
vite: {
|
|
134
|
+
server: {
|
|
135
|
+
host: '0.0.0.0',
|
|
136
|
+
strictPort: true,
|
|
137
|
+
cors: {
|
|
138
|
+
origin: ['*.dev.licos.local'],
|
|
139
|
+
credentials: true,
|
|
140
|
+
},
|
|
141
|
+
hmr: previewHmrConfig || {
|
|
142
|
+
overlay: true,
|
|
143
|
+
path: '/hot/vite-hmr',
|
|
144
|
+
port: parseInt(process.env.HMR_PORT || '<%= hmrPort %>', 10),
|
|
145
|
+
clientPort: 443,
|
|
146
|
+
timeout: 30000,
|
|
147
|
+
},
|
|
148
|
+
// Fix EMFILE: too many open files error
|
|
149
|
+
// Exclude large directories from file watching to avoid exceeding system limits
|
|
150
|
+
watch: {
|
|
151
|
+
ignored: [
|
|
152
|
+
'**/node_modules/**',
|
|
153
|
+
'**/.nuxt/**',
|
|
154
|
+
'**/.output/**',
|
|
155
|
+
'**/dist/**',
|
|
156
|
+
'**/.git/**',
|
|
157
|
+
'**/coverage/**',
|
|
158
|
+
'**/.cache/**',
|
|
159
|
+
],
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
|
|
164
|
+
// Security headers (Content Security Policy)
|
|
165
|
+
nitro: {
|
|
166
|
+
publicAssets: [
|
|
167
|
+
{
|
|
168
|
+
baseURL: '/assets',
|
|
169
|
+
dir: resolve(__dirname, 'assets'),
|
|
170
|
+
},
|
|
171
|
+
],
|
|
172
|
+
routeRules: {
|
|
173
|
+
'/**': {
|
|
174
|
+
headers: {
|
|
175
|
+
'Content-Security-Policy':
|
|
176
|
+
"img-src 'self' data:;",
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
});
|
|
@@ -13,8 +13,8 @@ importers:
|
|
|
13
13
|
.:
|
|
14
14
|
dependencies:
|
|
15
15
|
'@kmlckj/licos-dev-sdk':
|
|
16
|
-
specifier: 0.2.
|
|
17
|
-
version: 0.2.
|
|
16
|
+
specifier: 0.2.16
|
|
17
|
+
version: 0.2.16
|
|
18
18
|
'@kmlckj/licos-platform-sdk':
|
|
19
19
|
specifier: 0.10.3
|
|
20
20
|
version: 0.10.3
|
|
@@ -731,8 +731,8 @@ packages:
|
|
|
731
731
|
'@jridgewell/trace-mapping@0.3.31':
|
|
732
732
|
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
|
|
733
733
|
|
|
734
|
-
'@kmlckj/licos-dev-sdk@0.2.
|
|
735
|
-
resolution: {integrity: sha512-
|
|
734
|
+
'@kmlckj/licos-dev-sdk@0.2.16':
|
|
735
|
+
resolution: {integrity: sha512-F2nJH0ODLaNCyujaDflFm5iBL4YxJxnnWKC6Rvy6MXF8Z01yhvq1q0EUveF1LYzeaQH3yl6j1W50Gp8nBdSoRQ==}
|
|
736
736
|
engines: {node: '>=18'}
|
|
737
737
|
|
|
738
738
|
'@kmlckj/licos-platform-sdk@0.10.3':
|
|
@@ -4741,7 +4741,7 @@ snapshots:
|
|
|
4741
4741
|
'@jridgewell/resolve-uri': 3.1.2
|
|
4742
4742
|
'@jridgewell/sourcemap-codec': 1.5.5
|
|
4743
4743
|
|
|
4744
|
-
'@kmlckj/licos-dev-sdk@0.2.
|
|
4744
|
+
'@kmlckj/licos-dev-sdk@0.2.16': {}
|
|
4745
4745
|
|
|
4746
4746
|
'@kmlckj/licos-platform-sdk@0.10.3':
|
|
4747
4747
|
dependencies:
|
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
set -Eeuo pipefail
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
if [[ -n "${LICOS_RUN_PORT:-}" ]]; then
|
|
5
|
+
PORT="${LICOS_RUN_PORT}"
|
|
6
|
+
elif [[ -z "${PORT:-}" ]]; then
|
|
7
|
+
PORT=<%= port %>
|
|
8
|
+
fi
|
|
7
9
|
PROJECT_DIR="${LICOS_PROJECT_PATH:-${LICOS_WORKSPACE_PATH:-$(pwd)}}"
|
|
8
|
-
DEPLOY_RUN_PORT="${
|
|
9
|
-
<% } else { %>
|
|
10
|
-
PORT=<%= port %>
|
|
11
|
-
PROJECT_DIR="${LICOS_PROJECT_PATH:-${LICOS_WORKSPACE_PATH:-$(pwd)}}"
|
|
12
|
-
DEPLOY_RUN_PORT=<%= port %>
|
|
13
|
-
<% } %>
|
|
10
|
+
DEPLOY_RUN_PORT="${PORT}"
|
|
14
11
|
|
|
15
12
|
cd "${PROJECT_DIR}"
|
|
16
13
|
|
|
@@ -26,7 +23,8 @@ kill_port_if_listening() {
|
|
|
26
23
|
sleep 1
|
|
27
24
|
pids=$(ss -H -lntp 2>/dev/null | awk -v port="${DEPLOY_RUN_PORT}" '$4 ~ ":"port"$"' | grep -o 'pid=[0-9]*' | cut -d= -f2 | paste -sd' ' - || true)
|
|
28
25
|
if [[ -n "${pids}" ]]; then
|
|
29
|
-
echo "
|
|
26
|
+
echo "Preview port ${DEPLOY_RUN_PORT} is still busy after cleanup, PIDs: ${pids}. Refusing to use another port."
|
|
27
|
+
exit 1
|
|
30
28
|
else
|
|
31
29
|
echo "Port ${DEPLOY_RUN_PORT} cleared."
|
|
32
30
|
fi
|
|
@@ -43,7 +43,8 @@ kill_port_if_listening() {
|
|
|
43
43
|
sleep 1
|
|
44
44
|
pids=$(ss -H -lntp 2>/dev/null | awk -v port="${port}" '$4 ~ ":"port"$"' | grep -o 'pid=[0-9]*' | cut -d= -f2 | sort -u | paste -sd' ' - || true)
|
|
45
45
|
if [[ -n "${pids}" ]]; then
|
|
46
|
-
echo "
|
|
46
|
+
echo "Preview port ${port} is still busy after cleanup, PIDs: ${pids}. Refusing to use another port."
|
|
47
|
+
exit 1
|
|
47
48
|
else
|
|
48
49
|
echo "Port ${port} cleared."
|
|
49
50
|
fi
|
|
@@ -186,8 +186,8 @@ importers:
|
|
|
186
186
|
server:
|
|
187
187
|
dependencies:
|
|
188
188
|
'@kmlckj/licos-dev-sdk':
|
|
189
|
-
specifier: 0.2.
|
|
190
|
-
version: 0.2.
|
|
189
|
+
specifier: 0.2.16
|
|
190
|
+
version: 0.2.16
|
|
191
191
|
'@kmlckj/licos-platform-sdk':
|
|
192
192
|
specifier: 0.10.3
|
|
193
193
|
version: 0.10.3
|
|
@@ -2595,8 +2595,8 @@ packages:
|
|
|
2595
2595
|
'@keyv/serialize@1.1.1':
|
|
2596
2596
|
resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==}
|
|
2597
2597
|
|
|
2598
|
-
'@kmlckj/licos-dev-sdk@0.2.
|
|
2599
|
-
resolution: {integrity: sha512-
|
|
2598
|
+
'@kmlckj/licos-dev-sdk@0.2.16':
|
|
2599
|
+
resolution: {integrity: sha512-F2nJH0ODLaNCyujaDflFm5iBL4YxJxnnWKC6Rvy6MXF8Z01yhvq1q0EUveF1LYzeaQH3yl6j1W50Gp8nBdSoRQ==}
|
|
2600
2600
|
engines: {node: '>=18'}
|
|
2601
2601
|
|
|
2602
2602
|
'@kmlckj/licos-platform-sdk@0.10.3':
|
|
@@ -12400,7 +12400,7 @@ snapshots:
|
|
|
12400
12400
|
|
|
12401
12401
|
'@keyv/serialize@1.1.1': {}
|
|
12402
12402
|
|
|
12403
|
-
'@kmlckj/licos-dev-sdk@0.2.
|
|
12403
|
+
'@kmlckj/licos-dev-sdk@0.2.16': {}
|
|
12404
12404
|
|
|
12405
12405
|
'@kmlckj/licos-platform-sdk@0.10.3':
|
|
12406
12406
|
dependencies:
|
|
@@ -13,8 +13,8 @@ importers:
|
|
|
13
13
|
.:
|
|
14
14
|
dependencies:
|
|
15
15
|
'@kmlckj/licos-dev-sdk':
|
|
16
|
-
specifier: 0.2.
|
|
17
|
-
version: 0.2.
|
|
16
|
+
specifier: 0.2.16
|
|
17
|
+
version: 0.2.16
|
|
18
18
|
'@kmlckj/licos-platform-sdk':
|
|
19
19
|
specifier: 0.10.3
|
|
20
20
|
version: 0.10.3
|
|
@@ -291,8 +291,8 @@ packages:
|
|
|
291
291
|
'@jridgewell/trace-mapping@0.3.31':
|
|
292
292
|
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
|
|
293
293
|
|
|
294
|
-
'@kmlckj/licos-dev-sdk@0.2.
|
|
295
|
-
resolution: {integrity: sha512-
|
|
294
|
+
'@kmlckj/licos-dev-sdk@0.2.16':
|
|
295
|
+
resolution: {integrity: sha512-F2nJH0ODLaNCyujaDflFm5iBL4YxJxnnWKC6Rvy6MXF8Z01yhvq1q0EUveF1LYzeaQH3yl6j1W50Gp8nBdSoRQ==}
|
|
296
296
|
engines: {node: '>=18'}
|
|
297
297
|
|
|
298
298
|
'@kmlckj/licos-platform-sdk@0.10.3':
|
|
@@ -1723,7 +1723,7 @@ snapshots:
|
|
|
1723
1723
|
'@jridgewell/resolve-uri': 3.1.2
|
|
1724
1724
|
'@jridgewell/sourcemap-codec': 1.5.5
|
|
1725
1725
|
|
|
1726
|
-
'@kmlckj/licos-dev-sdk@0.2.
|
|
1726
|
+
'@kmlckj/licos-dev-sdk@0.2.16': {}
|
|
1727
1727
|
|
|
1728
1728
|
'@kmlckj/licos-platform-sdk@0.10.3':
|
|
1729
1729
|
dependencies:
|
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
set -Eeuo pipefail
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
if [[ -n "${LICOS_RUN_PORT:-}" ]]; then
|
|
5
|
+
PORT="${LICOS_RUN_PORT}"
|
|
6
|
+
elif [[ -z "${PORT:-}" ]]; then
|
|
7
|
+
PORT=<%= port %>
|
|
8
|
+
fi
|
|
7
9
|
PROJECT_DIR="${LICOS_PROJECT_PATH:-${LICOS_WORKSPACE_PATH:-$(pwd)}}"
|
|
8
|
-
DEPLOY_RUN_PORT="${
|
|
9
|
-
<% } else { %>
|
|
10
|
-
PORT=<%= port %>
|
|
11
|
-
PROJECT_DIR="${LICOS_PROJECT_PATH:-${LICOS_WORKSPACE_PATH:-$(pwd)}}"
|
|
12
|
-
DEPLOY_RUN_PORT=<%= port %>
|
|
13
|
-
<% } %>
|
|
10
|
+
DEPLOY_RUN_PORT="${PORT}"
|
|
14
11
|
|
|
15
12
|
cd "${PROJECT_DIR}"
|
|
16
13
|
|
|
@@ -26,7 +23,8 @@ kill_port_if_listening() {
|
|
|
26
23
|
sleep 1
|
|
27
24
|
pids=$(ss -H -lntp 2>/dev/null | awk -v port="${DEPLOY_RUN_PORT}" '$4 ~ ":"port"$"' | grep -o 'pid=[0-9]*' | cut -d= -f2 | paste -sd' ' - || true)
|
|
28
25
|
if [[ -n "${pids}" ]]; then
|
|
29
|
-
echo "
|
|
26
|
+
echo "Preview port ${DEPLOY_RUN_PORT} is still busy after cleanup, PIDs: ${pids}. Refusing to use another port."
|
|
27
|
+
exit 1
|
|
30
28
|
else
|
|
31
29
|
echo "Port ${DEPLOY_RUN_PORT} cleared."
|
|
32
30
|
fi
|
|
@@ -1,64 +1,65 @@
|
|
|
1
|
-
import { defineConfig } from 'vite';
|
|
2
|
-
|
|
3
|
-
function normalizeBasePath(value?: string): string {
|
|
4
|
-
const trimmed = value?.trim();
|
|
5
|
-
if (!trimmed || trimmed === '/') return '/';
|
|
6
|
-
return `/${trimmed.replace(/^\/+|\/+$/g, '')}/`;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
function isProdProjectEnv(value?: string): boolean {
|
|
10
|
-
const normalized = value?.trim().toLowerCase();
|
|
11
|
-
return normalized === 'prod' || normalized === 'production' || normalized === 'release';
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
const deployBasePath = process.env.VITE_BASE_PATH || process.env.BASE_PATH;
|
|
15
|
-
const shouldUseBasePath = Boolean(deployBasePath) || isProdProjectEnv(process.env.LICOS_PROJECT_ENV);
|
|
16
|
-
|
|
17
|
-
function parsePort(value?: string): number | undefined {
|
|
18
|
-
const port = Number.parseInt(value || '', 10);
|
|
19
|
-
return Number.isInteger(port) && port > 0 ? port : undefined;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function createPreviewHmrConfig() {
|
|
23
|
-
if (!process.env.LICOS_PREVIEW_BASE_PATH) {
|
|
24
|
-
return undefined;
|
|
25
|
-
}
|
|
26
|
-
const hmr: Record<string, unknown> = {
|
|
27
|
-
overlay: true,
|
|
28
|
-
path: process.env.LICOS_PREVIEW_HMR_PATH || '/hot/vite-hmr',
|
|
29
|
-
timeout: 30000,
|
|
30
|
-
};
|
|
31
|
-
if (process.env.LICOS_PREVIEW_HMR_HOST) {
|
|
32
|
-
hmr.host = process.env.LICOS_PREVIEW_HMR_HOST;
|
|
33
|
-
}
|
|
34
|
-
if (process.env.LICOS_PREVIEW_HMR_PROTOCOL) {
|
|
35
|
-
hmr.protocol = process.env.LICOS_PREVIEW_HMR_PROTOCOL;
|
|
36
|
-
}
|
|
37
|
-
const clientPort = parsePort(process.env.LICOS_PREVIEW_HMR_CLIENT_PORT);
|
|
38
|
-
if (clientPort) {
|
|
39
|
-
hmr.clientPort = clientPort;
|
|
40
|
-
}
|
|
41
|
-
return hmr;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
const previewHmrConfig = createPreviewHmrConfig();
|
|
45
|
-
|
|
46
|
-
export default defineConfig({
|
|
47
|
-
base: shouldUseBasePath ? normalizeBasePath(deployBasePath) : '/',
|
|
48
|
-
server: {
|
|
49
|
-
port: <%= port %>,
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
1
|
+
import { defineConfig } from 'vite';
|
|
2
|
+
|
|
3
|
+
function normalizeBasePath(value?: string): string {
|
|
4
|
+
const trimmed = value?.trim();
|
|
5
|
+
if (!trimmed || trimmed === '/') return '/';
|
|
6
|
+
return `/${trimmed.replace(/^\/+|\/+$/g, '')}/`;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function isProdProjectEnv(value?: string): boolean {
|
|
10
|
+
const normalized = value?.trim().toLowerCase();
|
|
11
|
+
return normalized === 'prod' || normalized === 'production' || normalized === 'release';
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const deployBasePath = process.env.VITE_BASE_PATH || process.env.BASE_PATH;
|
|
15
|
+
const shouldUseBasePath = Boolean(deployBasePath) || isProdProjectEnv(process.env.LICOS_PROJECT_ENV);
|
|
16
|
+
|
|
17
|
+
function parsePort(value?: string): number | undefined {
|
|
18
|
+
const port = Number.parseInt(value || '', 10);
|
|
19
|
+
return Number.isInteger(port) && port > 0 ? port : undefined;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function createPreviewHmrConfig() {
|
|
23
|
+
if (!process.env.LICOS_PREVIEW_BASE_PATH) {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
const hmr: Record<string, unknown> = {
|
|
27
|
+
overlay: true,
|
|
28
|
+
path: process.env.LICOS_PREVIEW_HMR_PATH || '/hot/vite-hmr',
|
|
29
|
+
timeout: 30000,
|
|
30
|
+
};
|
|
31
|
+
if (process.env.LICOS_PREVIEW_HMR_HOST) {
|
|
32
|
+
hmr.host = process.env.LICOS_PREVIEW_HMR_HOST;
|
|
33
|
+
}
|
|
34
|
+
if (process.env.LICOS_PREVIEW_HMR_PROTOCOL) {
|
|
35
|
+
hmr.protocol = process.env.LICOS_PREVIEW_HMR_PROTOCOL;
|
|
36
|
+
}
|
|
37
|
+
const clientPort = parsePort(process.env.LICOS_PREVIEW_HMR_CLIENT_PORT);
|
|
38
|
+
if (clientPort) {
|
|
39
|
+
hmr.clientPort = clientPort;
|
|
40
|
+
}
|
|
41
|
+
return hmr;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const previewHmrConfig = createPreviewHmrConfig();
|
|
45
|
+
|
|
46
|
+
export default defineConfig({
|
|
47
|
+
base: shouldUseBasePath ? normalizeBasePath(deployBasePath) : '/',
|
|
48
|
+
server: {
|
|
49
|
+
port: parsePort(process.env.LICOS_RUN_PORT) || parsePort(process.env.PORT) || <%= port %>,
|
|
50
|
+
strictPort: true,
|
|
51
|
+
host: '0.0.0.0',
|
|
52
|
+
allowedHosts: true,
|
|
53
|
+
hmr: previewHmrConfig || {
|
|
54
|
+
overlay: true,
|
|
55
|
+
path: '/hot/vite-hmr',
|
|
56
|
+
port: <%= hmrPort %>,
|
|
57
|
+
clientPort: 443,
|
|
58
|
+
timeout: 30000,
|
|
59
|
+
},
|
|
60
|
+
watch: {
|
|
61
|
+
usePolling: true,
|
|
62
|
+
interval: 100,
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
});
|