@lark-apaas/coding-template-nestjs-react-fullstack 0.1.0 → 0.1.1-beta.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/package.json
CHANGED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// ============================================================================
|
|
3
|
+
// 本地开发启动脚本(由 miaoda app sync 维护,请勿手改)
|
|
4
|
+
// Stack: nestjs-react-fullstack
|
|
5
|
+
//
|
|
6
|
+
// 流程:
|
|
7
|
+
// 1. env pull —— 拉沙箱身份/凭证到 .env.local
|
|
8
|
+
// 2. skills sync —— 同步当前 stack 的 agent skills
|
|
9
|
+
// 3. dotenv 加载 .env / .env.local 到 process.env(含 SUDA_WEBUSER 适配)
|
|
10
|
+
// 4. 并发起 dev:server + dev:client(子进程继承 process.env)
|
|
11
|
+
//
|
|
12
|
+
// 关键设计:本脚本在 spawn 子进程之前先把 .env / .env.local 加载到 process.env,
|
|
13
|
+
// 然后 spawn 的 server / client 进程通过 env 继承直接拿到——SDK(fullstack-nestjs-core
|
|
14
|
+
// / fullstack-vite-preset / fullstack-rspack-preset)无需自己 require('dotenv')。
|
|
15
|
+
//
|
|
16
|
+
// SUDA_WEBUSER 适配:沙箱 env pull 下发到 .env.local 的形态是
|
|
17
|
+
// `SUDA_WEBUSER="{\"user_id\":\"...\"}"`(shell-quoted JSON),dotenv@17 剥外层引号后
|
|
18
|
+
// 保留内部 `\"` 转义不还原,导致 process.env.SUDA_WEBUSER 是 `{\"user_id\":\"...\"}`
|
|
19
|
+
// 这种带反斜杠串,下游 JSON.parse 直接挂。这里做一次「直接 parse 失败则 unescape
|
|
20
|
+
// 后重 parse」兜底,把容错收敛在启动期单点,下游拿到干净 JSON 字符串。
|
|
21
|
+
// ============================================================================
|
|
22
|
+
const fs = require('node:fs');
|
|
23
|
+
const path = require('node:path');
|
|
24
|
+
const { execSync, spawn, spawnSync } = require('node:child_process');
|
|
25
|
+
|
|
26
|
+
process.chdir(path.resolve(__dirname, '..'));
|
|
27
|
+
|
|
28
|
+
function warn(msg) {
|
|
29
|
+
if (process.stderr.isTTY) process.stderr.write(`\x1b[33mWARNING: ${msg}\x1b[0m\n`);
|
|
30
|
+
else process.stderr.write(`WARNING: ${msg}\n`);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (!process.env.MIAODA_APP_TYPE) process.env.MIAODA_APP_TYPE = '3';
|
|
34
|
+
process.env.MIAODA_LOCAL_DEV = '1';
|
|
35
|
+
|
|
36
|
+
// 1. env pull
|
|
37
|
+
console.log('[dev-local] (1/4) env pull...');
|
|
38
|
+
const hasLarkCli = spawnSync('command', ['-v', 'lark-cli'], { shell: true, stdio: 'ignore' }).status === 0;
|
|
39
|
+
if (hasLarkCli) {
|
|
40
|
+
let appId = '';
|
|
41
|
+
try {
|
|
42
|
+
appId = JSON.parse(fs.readFileSync('.spark/meta.json', 'utf8')).app_id || '';
|
|
43
|
+
} catch {
|
|
44
|
+
/* meta.json 不存在或非法 JSON */
|
|
45
|
+
}
|
|
46
|
+
if (appId) {
|
|
47
|
+
const r = spawnSync('lark-cli', ['apps', '+env-pull', '--app-id', appId, '--as', 'user'], {
|
|
48
|
+
stdio: 'inherit',
|
|
49
|
+
});
|
|
50
|
+
if (r.status !== 0) warn('env pull 失败,继续按 .env.local 现状启动');
|
|
51
|
+
} else {
|
|
52
|
+
warn('.spark/meta.json 缺 app_id,请先跑 `miaoda app init --app-id <id>`');
|
|
53
|
+
}
|
|
54
|
+
} else {
|
|
55
|
+
warn('lark-cli 未安装,跳过 env pull;请确保 .env.local 已就绪');
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// 2. skills sync —— --local 切到 flat layout (.agents/skills + .claude/skills 软链),
|
|
59
|
+
// 跟沙箱 nested layout 区分。临时钉 @alpha:latest dist-tag 还停在老版 (0.1.6,无 skills /
|
|
60
|
+
// app sync 子命令);等 0.1.7 发到 latest 后切回 @latest。
|
|
61
|
+
console.log('[dev-local] (2/4) miaoda skills sync...');
|
|
62
|
+
try {
|
|
63
|
+
execSync('npx -y @lark-apaas/miaoda-cli@alpha skills sync --local', { stdio: 'inherit' });
|
|
64
|
+
} catch {
|
|
65
|
+
console.log(' (skills sync 失败,继续启动)');
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// 3. 加载 .env / .env.local 到 process.env
|
|
69
|
+
// dotenv 默认 override:false,先到先得 → 先 .env.local 让它优先于 .env;
|
|
70
|
+
// shell env 已在 process.env,两次 config 都不会覆盖。
|
|
71
|
+
console.log('[dev-local] (3/4) loading .env / .env.local...');
|
|
72
|
+
const dotenv = require('dotenv');
|
|
73
|
+
dotenv.config({ path: '.env.local' });
|
|
74
|
+
dotenv.config({ path: '.env' });
|
|
75
|
+
|
|
76
|
+
// SUDA_WEBUSER 适配(详见文件头注释)
|
|
77
|
+
if (process.env.SUDA_WEBUSER) {
|
|
78
|
+
const raw = process.env.SUDA_WEBUSER;
|
|
79
|
+
try {
|
|
80
|
+
JSON.parse(raw);
|
|
81
|
+
} catch {
|
|
82
|
+
try {
|
|
83
|
+
const unescaped = raw.replace(/\\"/g, '"');
|
|
84
|
+
JSON.parse(unescaped);
|
|
85
|
+
process.env.SUDA_WEBUSER = unescaped;
|
|
86
|
+
} catch {
|
|
87
|
+
warn(`SUDA_WEBUSER 解析失败,值头部: ${raw.slice(0, 80)}...`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// 4. 并发起前后端 dev server
|
|
93
|
+
console.log('[dev-local] (4/4) 并发起 dev:server + dev:client');
|
|
94
|
+
const child = spawn(
|
|
95
|
+
'npx',
|
|
96
|
+
[
|
|
97
|
+
'--no-install',
|
|
98
|
+
'concurrently',
|
|
99
|
+
'--names',
|
|
100
|
+
'server,client',
|
|
101
|
+
'--prefix-colors',
|
|
102
|
+
'blue,green',
|
|
103
|
+
'--kill-others-on-fail',
|
|
104
|
+
'npm run dev:server',
|
|
105
|
+
'npm run dev:client',
|
|
106
|
+
],
|
|
107
|
+
{ stdio: 'inherit', env: process.env },
|
|
108
|
+
);
|
|
109
|
+
child.on('exit', (code) => process.exit(code ?? 0));
|
|
110
|
+
child.on('error', (err) => {
|
|
111
|
+
console.error(err);
|
|
112
|
+
process.exit(1);
|
|
113
|
+
});
|
package/template/scripts/dev.sh
CHANGED
|
@@ -12,14 +12,15 @@ if [ -n "${SANDBOX_ID:-}" ]; then
|
|
|
12
12
|
exec node "$SCRIPT_DIR/dev.js" "$@"
|
|
13
13
|
fi
|
|
14
14
|
|
|
15
|
-
if [ ! -
|
|
16
|
-
echo "[dev] scripts/dev-local.
|
|
15
|
+
if [ ! -f "$SCRIPT_DIR/dev-local.js" ]; then
|
|
16
|
+
echo "[dev] scripts/dev-local.js 缺失;先跑 \`npx -y @lark-apaas/miaoda-cli@alpha app sync\` 同步平台脚本" >&2
|
|
17
17
|
exit 1
|
|
18
18
|
fi
|
|
19
19
|
|
|
20
20
|
# 本地启动前先跑一次 miaoda app sync:同步 platform-controlled 内容 + 升 @lark-apaas/* 到
|
|
21
|
-
#
|
|
22
|
-
#
|
|
21
|
+
# latest + 迁移老 npm scripts。沙箱不走这里(SANDBOX_ID 分支已经 exec return)。
|
|
22
|
+
# 临时钉 @alpha:latest dist-tag 还停在老版(0.1.6,无 app sync 子命令);等 0.1.7 发到
|
|
23
|
+
# latest 后切回 @latest。
|
|
23
24
|
npx -y @lark-apaas/miaoda-cli@alpha app sync || echo "[dev] miaoda app sync 失败,按现状继续" >&2
|
|
24
25
|
|
|
25
|
-
exec "$SCRIPT_DIR/dev-local.
|
|
26
|
+
exec node "$SCRIPT_DIR/dev-local.js" "$@"
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# ============================================================================
|
|
3
|
-
# 本地开发启动脚本(由 miaoda app sync 维护,请勿手改)
|
|
4
|
-
# Stack: nestjs-react-fullstack
|
|
5
|
-
# 流程:env pull → skills sync → 并发起 server + client
|
|
6
|
-
# ============================================================================
|
|
7
|
-
set -euo pipefail
|
|
8
|
-
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
|
9
|
-
cd "$ROOT_DIR"
|
|
10
|
-
|
|
11
|
-
warn() {
|
|
12
|
-
if [ -t 2 ]; then
|
|
13
|
-
printf '\033[33mWARNING: %s\033[0m\n' "$*" >&2
|
|
14
|
-
else
|
|
15
|
-
printf 'WARNING: %s\n' "$*" >&2
|
|
16
|
-
fi
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
# 应用 scene + 本地开发开关
|
|
20
|
-
export MIAODA_APP_TYPE="${MIAODA_APP_TYPE:-3}"
|
|
21
|
-
export MIAODA_LOCAL_DEV=1
|
|
22
|
-
|
|
23
|
-
# 1. 拉本地开发环境变量到 .env.local
|
|
24
|
-
echo "[dev-local] (1/3) env pull..."
|
|
25
|
-
if command -v lark-cli >/dev/null 2>&1; then
|
|
26
|
-
APP_ID=$(node -e 'try{process.stdout.write(JSON.parse(require("fs").readFileSync(".spark/meta.json","utf8")).app_id||"")}catch(e){}' 2>/dev/null || echo "")
|
|
27
|
-
if [ -n "$APP_ID" ]; then
|
|
28
|
-
lark-cli apps +env-pull --app-id "$APP_ID" --as user || warn "env pull 失败,继续按 .env.local 现状启动"
|
|
29
|
-
else
|
|
30
|
-
warn ".spark/meta.json 缺 app_id,请先跑 \`miaoda app init --app-id <id>\`"
|
|
31
|
-
fi
|
|
32
|
-
else
|
|
33
|
-
warn "lark-cli 未安装,跳过 env pull;请确保 .env.local 已就绪"
|
|
34
|
-
fi
|
|
35
|
-
|
|
36
|
-
# 2. 同步当前 stack 对应的 skills
|
|
37
|
-
echo "[dev-local] (2/3) miaoda skills sync..."
|
|
38
|
-
npx -y @lark-apaas/miaoda-cli@alpha skills sync || echo " (skills sync 失败,继续启动)"
|
|
39
|
-
|
|
40
|
-
# 3. 并发起前后端 dev server
|
|
41
|
-
echo "[dev-local] (3/3) 并发起 dev:server + dev:client"
|
|
42
|
-
exec npx --no-install concurrently \
|
|
43
|
-
--names "server,client" --prefix-colors "blue,green" --kill-others-on-fail \
|
|
44
|
-
"npm run dev:server" "npm run dev:client"
|