@lark-apaas/fullstack-cli 1.1.51 → 1.1.52-alpha.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 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 envPath = path2.resolve(process.cwd(), ".env");
2158
- if (fs4.existsSync(envPath)) {
2159
- loadEnv({ path: envPath });
2157
+ const envPath2 = path2.resolve(process.cwd(), ".env");
2158
+ if (fs4.existsSync(envPath2)) {
2159
+ loadEnv({ path: envPath2 });
2160
2160
  console.log("[gen-db-schema] \u2713 Loaded .env file");
2161
2161
  }
2162
2162
  const databaseUrl = process.env.SUDA_DATABASE_URL;
@@ -8146,11 +8146,9 @@ var commands = [
8146
8146
  ];
8147
8147
 
8148
8148
  // src/index.ts
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
- }
8149
+ var envPath = path25.join(process.cwd(), ".env");
8150
+ if (fs29.existsSync(envPath)) {
8151
+ dotenvConfig({ path: envPath });
8154
8152
  }
8155
8153
  var __dirname = path25.dirname(fileURLToPath5(import.meta.url));
8156
8154
  var pkg = JSON.parse(fs29.readFileSync(path25.join(__dirname, "../package.json"), "utf-8"));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lark-apaas/fullstack-cli",
3
- "version": "1.1.51",
3
+ "version": "1.1.52-alpha.0",
4
4
  "description": "CLI tool for fullstack template management",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,24 +1,2 @@
1
1
  #!/usr/bin/env bash
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" "$@"
2
+ exec node "$(dirname "$0")/dev.js" "$@"
@@ -23,6 +23,19 @@ function runCommand(command, args) {
23
23
  });
24
24
  }
25
25
 
26
+ // 串行依次执行每个任务,全部跑完后再聚合退出码:
27
+ // 降低并发资源占用、让各任务输出按顺序清晰可读,同时保留“一次暴露所有 lint 问题”的行为。
28
+ async function runTasksSerially(taskSpecs) {
29
+ let exitCode = 0;
30
+ for (const [command, args] of taskSpecs) {
31
+ const code = await runCommand(command, args);
32
+ if (code !== 0) {
33
+ exitCode = 1;
34
+ }
35
+ }
36
+ return exitCode;
37
+ }
38
+
26
39
  function normalizeProjectFile(filePath) {
27
40
  const absolutePath = path.isAbsolute(filePath)
28
41
  ? filePath
@@ -64,13 +77,13 @@ function isStylelintTarget(filePath) {
64
77
  }
65
78
 
66
79
  async function runDefaultLint() {
67
- const code = await runCommand(getBinName('npx'), [
68
- 'concurrently',
69
- 'npm run eslint',
70
- 'npm run type:check',
71
- 'npm run stylelint',
72
- ]);
73
- process.exit(code);
80
+ const taskSpecs = [
81
+ [getBinName('npm'), ['run', 'eslint']],
82
+ [getBinName('npm'), ['run', 'type:check']],
83
+ [getBinName('npm'), ['run', 'stylelint']],
84
+ ];
85
+
86
+ process.exit(await runTasksSerially(taskSpecs));
74
87
  }
75
88
 
76
89
  async function runSelectiveLint(inputFiles) {
@@ -101,31 +114,30 @@ async function runSelectiveLint(inputFiles) {
101
114
  }
102
115
  }
103
116
 
104
- const tasks = [];
117
+ const taskSpecs = [];
105
118
 
106
119
  if (eslintFiles.length > 0) {
107
- tasks.push(runCommand(getBinName('npx'), ['eslint', '--quiet', ...eslintFiles]));
120
+ taskSpecs.push([getBinName('npx'), ['eslint', '--quiet', ...eslintFiles]]);
108
121
  }
109
122
 
110
123
  if (stylelintFiles.length > 0) {
111
- tasks.push(runCommand(getBinName('npx'), ['stylelint', '--quiet', ...stylelintFiles]));
124
+ taskSpecs.push([getBinName('npx'), ['stylelint', '--quiet', ...stylelintFiles]]);
112
125
  }
113
126
 
114
127
  if (clientTypeFiles.length > 0) {
115
- tasks.push(runCommand(getBinName('npm'), ['run', 'type:check:client']));
128
+ taskSpecs.push([getBinName('npm'), ['run', 'type:check:client']]);
116
129
  }
117
130
 
118
131
  if (serverTypeFiles.length > 0) {
119
- tasks.push(runCommand(getBinName('npm'), ['run', 'type:check:server']));
132
+ taskSpecs.push([getBinName('npm'), ['run', 'type:check:server']]);
120
133
  }
121
134
 
122
- if (tasks.length === 0) {
135
+ if (taskSpecs.length === 0) {
123
136
  console.log('[lint] No supported files matched for lint');
124
137
  process.exit(0);
125
138
  }
126
139
 
127
- const results = await Promise.all(tasks);
128
- process.exit(results.some(code => code !== 0) ? 1 : 0);
140
+ process.exit(await runTasksSerially(taskSpecs));
129
141
  }
130
142
 
131
143
  async function main() {
@@ -1,113 +0,0 @@
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
- });