@lark-apaas/fullstack-cli 1.1.48-alpha.8 → 1.1.48-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 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
- var syncConfig = {
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: "npx -y @lark-apaas/fullstack-cli action-plugin init",
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
- permissions: {
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 syncConfig;
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("[fullstack-cli] Starting sync...");
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
- try {
2658
- activateGitHooks(userProjectRoot);
2659
- } catch (error) {
2660
- const message = error instanceof Error ? error.message : String(error);
2661
- console.warn(`[fullstack-cli] \u26A0 Failed to activate git hooks: ${message}`);
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 syncConfig2 = genSyncConfig({ disableGenOpenapi });
3173
+ const syncConfig = genSyncConfig(void 0, { disableGenOpenapi });
3160
3174
  const filesToStage = /* @__PURE__ */ new Set();
3161
- syncConfig2.sync.forEach((rule) => {
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("server/capabilities directory not found");
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.8",
3
+ "version": "1.1.48-beta.0",
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.7-alpha.7",
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",
@@ -1,32 +1,2 @@
1
1
  #!/usr/bin/env bash
2
- # `npm run dev` 入口;按 IS_SANDBOX 分发:
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" "$@"