@lark-apaas/fullstack-cli 1.1.48-alpha.8 → 1.1.48-alpha.9
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 +72 -53
- package/package.json +2 -2
- package/templates/scripts/dev.sh +1 -31
package/dist/index.js
CHANGED
|
@@ -2370,9 +2370,8 @@ import fs7 from "fs";
|
|
|
2370
2370
|
import { fileURLToPath as fileURLToPath3 } from "url";
|
|
2371
2371
|
|
|
2372
2372
|
// src/config/sync.ts
|
|
2373
|
-
|
|
2374
|
-
|
|
2375
|
-
sync: [
|
|
2373
|
+
function buildDefaultRules(opts) {
|
|
2374
|
+
const rules = [
|
|
2376
2375
|
// 1. 派生 scripts 目录(总是覆盖;递归同步,包含 scripts/hooks/run-precommit.js)
|
|
2377
2376
|
{
|
|
2378
2377
|
from: "templates/scripts",
|
|
@@ -2435,23 +2434,13 @@ var syncConfig = {
|
|
|
2435
2434
|
to: ".gitignore",
|
|
2436
2435
|
pattern: "package-lock.json"
|
|
2437
2436
|
},
|
|
2438
|
-
// 5. 注册 postinstall 脚本,自动恢复 action plugins
|
|
2439
|
-
// 用 npx -y 形式而不是裸 `fullstack-cli`:用户项目的 deps 没有 fullstack-cli,
|
|
2440
|
-
// bare 形式在新机器(PATH 没全局 fullstack-cli)下 npm i 立即 ENOENT。
|
|
2437
|
+
// 5. 注册 postinstall 脚本,自动恢复 action plugins
|
|
2441
2438
|
{
|
|
2442
2439
|
type: "add-script",
|
|
2443
2440
|
name: "postinstall",
|
|
2444
|
-
command: "
|
|
2441
|
+
command: "fullstack-cli action-plugin init",
|
|
2445
2442
|
overwrite: false
|
|
2446
2443
|
},
|
|
2447
|
-
// 5a. 迁移已有应用的老形式 postinstall(裸 fullstack-cli → npx -y)。
|
|
2448
|
-
// patch-script 只在脚本以指定前缀开头时改写,用户真正手改过的脚本保持原样。
|
|
2449
|
-
{
|
|
2450
|
-
type: "patch-script",
|
|
2451
|
-
name: "postinstall",
|
|
2452
|
-
to: "npx -y @lark-apaas/fullstack-cli action-plugin init",
|
|
2453
|
-
ifStartsWith: "fullstack-cli action-plugin init"
|
|
2454
|
-
},
|
|
2455
2444
|
// 6. 替换 drizzle.config.ts(仅当文件存在时)
|
|
2456
2445
|
{
|
|
2457
2446
|
from: "templates/drizzle.config.ts",
|
|
@@ -2480,41 +2469,49 @@ var syncConfig = {
|
|
|
2480
2469
|
name: "lint",
|
|
2481
2470
|
to: "node ./scripts/lint.js",
|
|
2482
2471
|
ifStartsWith: "concurrently "
|
|
2483
|
-
},
|
|
2484
|
-
// 10. 把老 `npm run upgrade && ./scripts/dev.sh` 形式迁移到 `./scripts/dev.sh`,
|
|
2485
|
-
// 让本地 `npm run dev` 不再前置跑 fullstack-cli sync;fullstack-cli sync 现在由
|
|
2486
|
-
// 新版 dev.sh 内部按 IS_SANDBOX 分支决定是否跑(沙箱跑、本地跳)。
|
|
2487
|
-
{
|
|
2488
|
-
type: "patch-script",
|
|
2489
|
-
name: "dev",
|
|
2490
|
-
to: "./scripts/dev.sh",
|
|
2491
|
-
ifStartsWith: "npm run upgrade && "
|
|
2492
|
-
},
|
|
2493
|
-
// 11. 把 `upgrade` 脚本里裸 `fullstack-cli sync` 改成 `npx -y @lark-apaas/fullstack-cli sync`。
|
|
2494
|
-
// 跟 postinstall 同款根因:fullstack-cli 不是用户应用的 dep,新机器无全局命令会 ENOENT。
|
|
2495
|
-
{
|
|
2496
|
-
type: "patch-script",
|
|
2497
|
-
name: "upgrade",
|
|
2498
|
-
to: "npx -y @lark-apaas/fullstack-cli sync --disable-gen-openapi",
|
|
2499
|
-
ifStartsWith: "fullstack-cli sync"
|
|
2500
2472
|
}
|
|
2501
|
-
]
|
|
2502
|
-
|
|
2503
|
-
|
|
2504
|
-
// 所有 .sh 文件设置为可执行
|
|
2505
|
-
// '**/*.sh': 0o755,
|
|
2506
|
-
}
|
|
2507
|
-
};
|
|
2508
|
-
function genSyncConfig(perms = {}) {
|
|
2509
|
-
if (!perms.disableGenOpenapi) {
|
|
2510
|
-
syncConfig.sync.push({
|
|
2473
|
+
];
|
|
2474
|
+
if (!opts.disableGenOpenapi) {
|
|
2475
|
+
rules.push({
|
|
2511
2476
|
from: "templates/helper/gen-openapi.ts",
|
|
2512
2477
|
to: "scripts/gen-openapi.ts",
|
|
2513
2478
|
type: "file",
|
|
2514
2479
|
overwrite: true
|
|
2515
2480
|
});
|
|
2516
2481
|
}
|
|
2517
|
-
return
|
|
2482
|
+
return rules;
|
|
2483
|
+
}
|
|
2484
|
+
function defaultProfile(opts) {
|
|
2485
|
+
return {
|
|
2486
|
+
sync: buildDefaultRules(opts),
|
|
2487
|
+
// 文件权限设置(所有 .sh 文件设置为可执行:'**/*.sh': 0o755)
|
|
2488
|
+
permissions: {},
|
|
2489
|
+
activateGitHooks: true
|
|
2490
|
+
};
|
|
2491
|
+
}
|
|
2492
|
+
function emptyProfile() {
|
|
2493
|
+
return {
|
|
2494
|
+
sync: [],
|
|
2495
|
+
permissions: {},
|
|
2496
|
+
activateGitHooks: false
|
|
2497
|
+
};
|
|
2498
|
+
}
|
|
2499
|
+
function viteReactProfile() {
|
|
2500
|
+
return {
|
|
2501
|
+
sync: [],
|
|
2502
|
+
permissions: {},
|
|
2503
|
+
activateGitHooks: true
|
|
2504
|
+
};
|
|
2505
|
+
}
|
|
2506
|
+
var SYNC_PROFILES = {
|
|
2507
|
+
"design-stack": defaultProfile,
|
|
2508
|
+
"nestjs-react-fullstack": defaultProfile,
|
|
2509
|
+
"vite-react": viteReactProfile,
|
|
2510
|
+
html: emptyProfile
|
|
2511
|
+
};
|
|
2512
|
+
function genSyncConfig(stack, opts = {}) {
|
|
2513
|
+
const factory = stack && SYNC_PROFILES[stack] || defaultProfile;
|
|
2514
|
+
return factory(opts);
|
|
2518
2515
|
}
|
|
2519
2516
|
|
|
2520
2517
|
// src/utils/file-ops.ts
|
|
@@ -2639,9 +2636,10 @@ async function run2(options) {
|
|
|
2639
2636
|
console.log("[fullstack-cli] Skip syncing (not a valid npm project)");
|
|
2640
2637
|
process.exit(0);
|
|
2641
2638
|
}
|
|
2639
|
+
const stack = resolveStack(userProjectRoot);
|
|
2642
2640
|
try {
|
|
2643
|
-
console.log(
|
|
2644
|
-
const config = genSyncConfig({
|
|
2641
|
+
console.log(`[fullstack-cli] Starting sync${stack ? ` (stack: ${stack})` : ""}...`);
|
|
2642
|
+
const config = genSyncConfig(stack, {
|
|
2645
2643
|
disableGenOpenapi: options.disableGenOpenapi ?? false
|
|
2646
2644
|
});
|
|
2647
2645
|
if (!config || !config.sync) {
|
|
@@ -2654,11 +2652,13 @@ async function run2(options) {
|
|
|
2654
2652
|
if (config.permissions) {
|
|
2655
2653
|
setPermissions(config.permissions, userProjectRoot);
|
|
2656
2654
|
}
|
|
2657
|
-
|
|
2658
|
-
|
|
2659
|
-
|
|
2660
|
-
|
|
2661
|
-
|
|
2655
|
+
if (config.activateGitHooks !== false) {
|
|
2656
|
+
try {
|
|
2657
|
+
activateGitHooks(userProjectRoot);
|
|
2658
|
+
} catch (error) {
|
|
2659
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
2660
|
+
console.warn(`[fullstack-cli] \u26A0 Failed to activate git hooks: ${message}`);
|
|
2661
|
+
}
|
|
2662
2662
|
}
|
|
2663
2663
|
console.log("[fullstack-cli] Sync completed successfully \u2705");
|
|
2664
2664
|
} catch (error) {
|
|
@@ -2667,6 +2667,20 @@ async function run2(options) {
|
|
|
2667
2667
|
process.exit(1);
|
|
2668
2668
|
}
|
|
2669
2669
|
}
|
|
2670
|
+
function resolveStack(userProjectRoot) {
|
|
2671
|
+
const sparkMetaPath = path5.join(userProjectRoot, ".spark", "meta.json");
|
|
2672
|
+
if (!fs7.existsSync(sparkMetaPath)) {
|
|
2673
|
+
return void 0;
|
|
2674
|
+
}
|
|
2675
|
+
try {
|
|
2676
|
+
const meta = JSON.parse(fs7.readFileSync(sparkMetaPath, "utf-8"));
|
|
2677
|
+
return typeof meta.stack === "string" ? meta.stack : void 0;
|
|
2678
|
+
} catch (error) {
|
|
2679
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
2680
|
+
console.warn(`[fullstack-cli] \u26A0 Failed to read .spark/meta.json, fallback to default sync: ${message}`);
|
|
2681
|
+
return void 0;
|
|
2682
|
+
}
|
|
2683
|
+
}
|
|
2670
2684
|
async function syncRule(rule, pluginRoot, userProjectRoot) {
|
|
2671
2685
|
if (rule.type === "delete-file" || rule.type === "delete-directory") {
|
|
2672
2686
|
const destPath2 = path5.join(userProjectRoot, rule.to);
|
|
@@ -3156,9 +3170,9 @@ function getCliVersion() {
|
|
|
3156
3170
|
|
|
3157
3171
|
// src/commands/upgrade/get-upgrade-files.ts
|
|
3158
3172
|
function getUpgradeFilesToStage(disableGenOpenapi = true) {
|
|
3159
|
-
const
|
|
3173
|
+
const syncConfig = genSyncConfig(void 0, { disableGenOpenapi });
|
|
3160
3174
|
const filesToStage = /* @__PURE__ */ new Set();
|
|
3161
|
-
|
|
3175
|
+
syncConfig.sync.forEach((rule) => {
|
|
3162
3176
|
if (rule.type === "file" || rule.type === "directory" || rule.type === "merge-json") {
|
|
3163
3177
|
filesToStage.add(rule.to);
|
|
3164
3178
|
} else if (rule.type === "remove-line" || rule.type === "add-line") {
|
|
@@ -4481,10 +4495,15 @@ import fs15 from "fs";
|
|
|
4481
4495
|
import { createRequire as createRequire2 } from "module";
|
|
4482
4496
|
import path13 from "path";
|
|
4483
4497
|
var CAPABILITIES_DIR = "server/capabilities";
|
|
4498
|
+
var SHARED_CAPABILITIES_DIR = "shared/capabilities";
|
|
4484
4499
|
function getProjectRoot2() {
|
|
4485
4500
|
return process.cwd();
|
|
4486
4501
|
}
|
|
4487
4502
|
function getCapabilitiesDir() {
|
|
4503
|
+
const sharedDir = path13.join(getProjectRoot2(), SHARED_CAPABILITIES_DIR);
|
|
4504
|
+
if (fs15.existsSync(sharedDir)) {
|
|
4505
|
+
return sharedDir;
|
|
4506
|
+
}
|
|
4488
4507
|
return path13.join(getProjectRoot2(), CAPABILITIES_DIR);
|
|
4489
4508
|
}
|
|
4490
4509
|
function getCapabilityPath(id) {
|
|
@@ -4659,7 +4678,7 @@ function logError(message) {
|
|
|
4659
4678
|
async function list2(options) {
|
|
4660
4679
|
try {
|
|
4661
4680
|
if (!capabilitiesDirExists()) {
|
|
4662
|
-
logError("
|
|
4681
|
+
logError("capabilities directory not found (looked for shared/capabilities and server/capabilities)");
|
|
4663
4682
|
process.exit(1);
|
|
4664
4683
|
}
|
|
4665
4684
|
if (options.id) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lark-apaas/fullstack-cli",
|
|
3
|
-
"version": "1.1.48-alpha.
|
|
3
|
+
"version": "1.1.48-alpha.9",
|
|
4
4
|
"description": "CLI tool for fullstack template management",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"access": "public"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@lark-apaas/http-client": "0.1.
|
|
34
|
+
"@lark-apaas/http-client": "^0.1.6",
|
|
35
35
|
"@lydell/node-pty": "1.1.0",
|
|
36
36
|
"@vercel/nft": "^0.30.3",
|
|
37
37
|
"commander": "^13.0.0",
|
package/templates/scripts/dev.sh
CHANGED
|
@@ -1,32 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
|
|
3
|
-
# - IS_SANDBOX=1(沙箱平台注入)→ 先 fullstack-cli sync 同步平台脚本,再跑 dev.js
|
|
4
|
-
# (保活 / restart loop / 文件日志 —— 沙箱生产形态)
|
|
5
|
-
# - 否则(本地)→ 跑 dev-local.sh:纯 stdout、崩了就崩、Agent 友好
|
|
6
|
-
# 显式想跑本地路径可用 `npm run dev:local`(绕过 IS_SANDBOX)。
|
|
7
|
-
set -euo pipefail
|
|
8
|
-
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
9
|
-
|
|
10
|
-
if [ "${IS_SANDBOX:-}" = "1" ] || [ "${IS_SANDBOX:-}" = "true" ]; then
|
|
11
|
-
# 沙箱前置同步:fullstack-cli sync 把平台管控的 scripts/ + 部分 package.json 字段同步过来。
|
|
12
|
-
# 不直接调 `fullstack-cli`,走 `npm run upgrade` 享 package.json 里的入口定义(与 prepublish
|
|
13
|
-
# 之类的钩子一致);后续若 upgrade 脚本换实现,dev 路径自动跟随。
|
|
14
|
-
npm run upgrade
|
|
15
|
-
exec node "$SCRIPT_DIR/dev.js" "$@"
|
|
16
|
-
fi
|
|
17
|
-
|
|
18
|
-
if [ ! -x "$SCRIPT_DIR/dev-local.sh" ]; then
|
|
19
|
-
echo "[dev] scripts/dev-local.sh 缺失或不可执行;先跑 \`miaoda app upgrade\` 同步平台脚本" >&2
|
|
20
|
-
exit 1
|
|
21
|
-
fi
|
|
22
|
-
|
|
23
|
-
# 本地启动前先跑一次 miaoda app upgrade:同步 platform-controlled 内容 + 升 @lark-apaas/* 到
|
|
24
|
-
# 最新 alpha + 迁移老 npm scripts。沙箱不走这里(IS_SANDBOX 分支已经 return)。miaoda 缺失时
|
|
25
|
-
# 软失败(agent 环境可能没装),靠用户自己保证 .env.local / scripts 现状能跑。
|
|
26
|
-
if command -v miaoda >/dev/null 2>&1; then
|
|
27
|
-
miaoda app upgrade || echo "[dev] miaoda app upgrade 失败,按现状继续" >&2
|
|
28
|
-
else
|
|
29
|
-
echo "[dev] miaoda 未装,跳过 upgrade;建议 npm i -g @lark-apaas/miaoda-cli" >&2
|
|
30
|
-
fi
|
|
31
|
-
|
|
32
|
-
exec "$SCRIPT_DIR/dev-local.sh" "$@"
|
|
2
|
+
exec node "$(dirname "$0")/dev.js" "$@"
|