@lark-apaas/fullstack-cli 1.1.52-alpha.0 → 1.1.52-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/dist/index.js +8 -6
- package/package.json +1 -1
- package/templates/scripts/dev-local.js +113 -0
- package/templates/scripts/dev.sh +23 -1
package/dist/index.js
CHANGED
|
@@ -2154,9 +2154,9 @@ async function parseAndGenerateNestResourceTemplate(options) {
|
|
|
2154
2154
|
var require2 = createRequire(import.meta.url);
|
|
2155
2155
|
async function run(options = {}) {
|
|
2156
2156
|
let exitCode = 0;
|
|
2157
|
-
const
|
|
2158
|
-
if (fs4.existsSync(
|
|
2159
|
-
loadEnv({ path:
|
|
2157
|
+
const envPath = path2.resolve(process.cwd(), ".env");
|
|
2158
|
+
if (fs4.existsSync(envPath)) {
|
|
2159
|
+
loadEnv({ path: envPath });
|
|
2160
2160
|
console.log("[gen-db-schema] \u2713 Loaded .env file");
|
|
2161
2161
|
}
|
|
2162
2162
|
const databaseUrl = process.env.SUDA_DATABASE_URL;
|
|
@@ -8146,9 +8146,11 @@ var commands = [
|
|
|
8146
8146
|
];
|
|
8147
8147
|
|
|
8148
8148
|
// src/index.ts
|
|
8149
|
-
|
|
8150
|
-
|
|
8151
|
-
|
|
8149
|
+
for (const filename of [".env.local", ".env"]) {
|
|
8150
|
+
const envPath = path25.join(process.cwd(), filename);
|
|
8151
|
+
if (fs29.existsSync(envPath)) {
|
|
8152
|
+
dotenvConfig({ path: envPath });
|
|
8153
|
+
}
|
|
8152
8154
|
}
|
|
8153
8155
|
var __dirname = path25.dirname(fileURLToPath5(import.meta.url));
|
|
8154
8156
|
var pkg = JSON.parse(fs29.readFileSync(path25.join(__dirname, "../package.json"), "utf-8"));
|
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 区分。不传 --version,handler 默认拉 coding-steering@latest,
|
|
60
|
+
// 保证每次本地 npm run dev 都把 skills 升到最新。
|
|
61
|
+
console.log('[dev-local] (2/4) miaoda skills sync...');
|
|
62
|
+
try {
|
|
63
|
+
execSync('npx -y @lark-apaas/miaoda-cli@latest 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/templates/scripts/dev.sh
CHANGED
|
@@ -1,2 +1,24 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
|
|
2
|
+
# `npm run dev` 入口;按 SANDBOX_ID 是否非空判断运行环境:
|
|
3
|
+
# - SANDBOX_ID 非空(沙箱平台注入应用所属沙箱 ID)→ 直接跑 dev.js
|
|
4
|
+
# (保活 / restart loop / 文件日志 —— 沙箱生产形态)。脚本同步由平台 pod 启动阶段做过,
|
|
5
|
+
# dev 入口不再额外 `npm run upgrade`。
|
|
6
|
+
# - 否则(本地)→ 走 miaoda app sync 兜底 + 跑 dev-local.js:纯 stdout、崩了就崩、Agent 友好。
|
|
7
|
+
# 显式想跑本地路径可用 `npm run dev:local`(绕过 SANDBOX_ID 判断)。
|
|
8
|
+
set -euo pipefail
|
|
9
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
10
|
+
|
|
11
|
+
if [ -n "${SANDBOX_ID:-}" ]; then
|
|
12
|
+
exec node "$SCRIPT_DIR/dev.js" "$@"
|
|
13
|
+
fi
|
|
14
|
+
|
|
15
|
+
if [ ! -f "$SCRIPT_DIR/dev-local.js" ]; then
|
|
16
|
+
echo "[dev] scripts/dev-local.js 缺失;先跑 \`npx -y @lark-apaas/miaoda-cli@latest app sync\` 同步平台脚本" >&2
|
|
17
|
+
exit 1
|
|
18
|
+
fi
|
|
19
|
+
|
|
20
|
+
# 本地启动前先跑一次 miaoda app sync:同步 platform-controlled 内容 + 升 @lark-apaas/* 到
|
|
21
|
+
# latest + 迁移老 npm scripts。沙箱不走这里(SANDBOX_ID 分支已经 exec return)。
|
|
22
|
+
npx -y @lark-apaas/miaoda-cli@latest app sync || echo "[dev] miaoda app sync 失败,按现状继续" >&2
|
|
23
|
+
|
|
24
|
+
exec node "$SCRIPT_DIR/dev-local.js" "$@"
|