@lark-apaas/miaoda-cli 0.1.18 → 0.1.19

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.
@@ -198,7 +198,7 @@ function registerAppInit(parent) {
198
198
  异步安装(--async-install)
199
199
  跳过同步 npm install,派发一个 detached 后台进程装依赖后立即返回。
200
200
  .spark/meta.json 在返回前写出(= 脚手架就绪),install 真实结果由 event marker 表达。
201
- 仅沙箱(SANDBOX_ID 非空)写 marker(presence 定成败,content 给排障):
201
+ 仅沙箱(MIAODA_DEP_CACHE_DIR 非空)写 marker(presence 定成败,content 给排障):
202
202
  成功 → /tmp/event/WORKSPACE_READY
203
203
  失败 → /tmp/event/WORKSPACE_FAILED
204
204
  安装日志:/tmp/async_install_dep.std.log
@@ -11,6 +11,7 @@ const coding_steering_1 = require("../../../utils/coding-steering");
11
11
  const logger_1 = require("../../../utils/logger");
12
12
  const githooks_1 = require("../../../utils/githooks");
13
13
  const logs_dir_1 = require("../../../utils/logs-dir");
14
+ const env_1 = require("../../../utils/env");
14
15
  const error_1 = require("../../../utils/error");
15
16
  const output_1 = require("../../../utils/output");
16
17
  /**
@@ -72,12 +73,12 @@ async function handleAppInit(opts) {
72
73
  (0, logs_dir_1.ensureLogsDir)(targetDir);
73
74
  // skills 同步软失败:拉不到 coding-steering 包不该阻断 writeSparkMeta /
74
75
  // activateGitHooks(之前会让 .spark/meta.json 没写,下次 init 半渲染状态又得重跑全套)。
75
- // 按运行环境(SANDBOX_ID)分流 outputLayout,不绑 stack:
76
- // - 沙箱内(SANDBOX_ID 非空)→ nested (.agent/skills/steering/<stack>/skills/),
76
+ // 按运行环境(isSandboxEnv:MIAODA_DEP_CACHE_DIR 非空)分流 outputLayout,不绑 stack:
77
+ // - 沙箱内 nested (.agent/skills/steering/<stack>/skills/),
77
78
  // 跟沙箱端 update-skills.sh 链路对齐
78
- // - 本地(SANDBOX_ID 空)→ flat (.agents/skills + .claude/skills 软链),
79
+ // - 本地 flat (.agents/skills + .claude/skills 软链),
79
80
  // Agent / Claude Code 用同一份;nrf 在本地是主战场,vite-react 等也一样适用
80
- const outputLayout = process.env.SANDBOX_ID !== undefined && process.env.SANDBOX_ID !== '' ? 'nested' : 'flat';
81
+ const outputLayout = (0, env_1.isSandboxEnv)() ? 'nested' : 'flat';
81
82
  let steeringResult;
82
83
  let steeringError;
83
84
  try {
@@ -14,6 +14,7 @@ const migrate_rule_1 = require("../../../utils/migrate-rule");
14
14
  const spark_meta_1 = require("../../../utils/spark-meta");
15
15
  const error_1 = require("../../../utils/error");
16
16
  const output_1 = require("../../../utils/output");
17
+ const env_1 = require("../../../utils/env");
17
18
  const logger_1 = require("../../../utils/logger");
18
19
  /**
19
20
  * miaoda app migrate --to <stack> [--from <stack>] [--dir <path>]
@@ -138,14 +139,12 @@ async function handleAppMigrate(opts) {
138
139
  // 跑的 node 进程仍按老逻辑工作(只起 vite,没起 nest),整体没切到 fullstack 模式。
139
140
  // 通过 pkill 杀掉 dev.js 主进程,依赖沙箱平台 supervisor 自动重新 exec dev.sh → dev.js,
140
141
  // 新进程用新 deps + 新 scripts,正常进入 fullstack 模式。
141
- // - 只在 SANDBOX_ID 非空时做(本地环境用户进程混杂,主动 pkill 风险大)
142
+ // - 只在沙箱内做(isSandboxEnv;本地环境用户进程混杂,主动 pkill 风险大)
142
143
  // - install 挂了不做 —— 新依赖不全, 杀旧 dev 后新 dev 起不来反而更糟,
143
144
  // 留着旧进程让用户先处理 installError
144
145
  // - 软失败:pkill 无匹配进程退出 1,catch 吞掉
145
146
  let devRestarted = false;
146
- if (installError === undefined &&
147
- process.env.SANDBOX_ID !== undefined &&
148
- process.env.SANDBOX_ID !== '') {
147
+ if (installError === undefined && (0, env_1.isSandboxEnv)()) {
149
148
  (0, logger_1.log)('migrate', '沙箱环境,重启 dev process(平台 supervisor 会自动拉起)...');
150
149
  try {
151
150
  (0, node_child_process_1.execFileSync)('pkill', ['-f', 'node.*scripts/dev\\.js'], { stdio: 'ignore' });
@@ -170,7 +169,7 @@ async function handleAppMigrate(opts) {
170
169
  followLatestPackages: followLatest,
171
170
  installError,
172
171
  devRestarted,
173
- nextActions: process.env.SANDBOX_ID !== undefined && process.env.SANDBOX_ID !== ''
172
+ nextActions: (0, env_1.isSandboxEnv)()
174
173
  ? [
175
174
  'git status / git diff 评估改动并 commit',
176
175
  'miaoda skills sync 同步到新 stack 的 agent skills',
@@ -4,12 +4,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.ASYNC_INSTALL_LOG = void 0;
7
- exports.isSandboxEnv = isSandboxEnv;
8
7
  exports.runAsyncInstallWorker = runAsyncInstallWorker;
9
8
  exports.dispatchAsyncInstall = dispatchAsyncInstall;
10
9
  const node_child_process_1 = require("node:child_process");
11
10
  const node_fs_1 = __importDefault(require("node:fs"));
12
11
  const node_path_1 = __importDefault(require("node:path"));
12
+ const env_1 = require("../../../utils/env");
13
13
  const install_1 = require("./install");
14
14
  /** event marker 目录,写死;写前 mkdir -p。沙箱里 code server 轮询此目录。 */
15
15
  const EVENT_DIR = '/tmp/event';
@@ -19,10 +19,6 @@ const MARKER_READY = 'WORKSPACE_READY';
19
19
  const MARKER_FAILED = 'WORKSPACE_FAILED';
20
20
  /** 后台 worker stdout/stderr 落盘路径 */
21
21
  exports.ASYNC_INSTALL_LOG = '/tmp/async_install_dep.std.log';
22
- /** 沙箱判定:SANDBOX_ID 非空。与 init handler 的 outputLayout 分流口径一致。 */
23
- function isSandboxEnv() {
24
- return process.env.SANDBOX_ID !== undefined && process.env.SANDBOX_ID !== '';
25
- }
26
22
  function nowIso() {
27
23
  return new Date().toISOString();
28
24
  }
@@ -44,7 +40,7 @@ function writeMarker(eventDir, name, content) {
44
40
  */
45
41
  function runAsyncInstallWorker(opts) {
46
42
  const eventDir = opts.eventDir ?? EVENT_DIR;
47
- const sandbox = isSandboxEnv();
43
+ const sandbox = (0, env_1.isSandboxEnv)();
48
44
  if (sandbox)
49
45
  clearStaleMarkers(eventDir);
50
46
  const start = Date.now();
@@ -89,7 +85,7 @@ function runAsyncInstallWorker(opts) {
89
85
  function dispatchAsyncInstall(opts) {
90
86
  const eventDir = opts.eventDir ?? EVENT_DIR;
91
87
  const logPath = opts.logPath ?? exports.ASYNC_INSTALL_LOG;
92
- const sandbox = isSandboxEnv();
88
+ const sandbox = (0, env_1.isSandboxEnv)();
93
89
  if (sandbox)
94
90
  clearStaleMarkers(eventDir);
95
91
  // targetDir 走 argv 传,不拼进代码串(免转义);只把本模块路径 JSON 内联进去。
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ASYNC_INSTALL_LOG = exports.isSandboxEnv = exports.runAsyncInstallWorker = exports.dispatchAsyncInstall = exports.resolveNpmInstallRegistry = exports.installDependencies = exports.writeSparkMeta = exports.readSparkMeta = exports.TEMPLATE_PACKAGE_BY_STACK = exports.SUPPORTED_STACKS = exports.renderTemplate = void 0;
3
+ exports.ASYNC_INSTALL_LOG = exports.runAsyncInstallWorker = exports.dispatchAsyncInstall = exports.resolveNpmInstallRegistry = exports.installDependencies = exports.writeSparkMeta = exports.readSparkMeta = exports.TEMPLATE_PACKAGE_BY_STACK = exports.SUPPORTED_STACKS = exports.renderTemplate = void 0;
4
4
  var template_1 = require("./template");
5
5
  Object.defineProperty(exports, "renderTemplate", { enumerable: true, get: function () { return template_1.renderTemplate; } });
6
6
  Object.defineProperty(exports, "SUPPORTED_STACKS", { enumerable: true, get: function () { return template_1.SUPPORTED_STACKS; } });
@@ -14,5 +14,4 @@ Object.defineProperty(exports, "resolveNpmInstallRegistry", { enumerable: true,
14
14
  var async_install_1 = require("./async-install");
15
15
  Object.defineProperty(exports, "dispatchAsyncInstall", { enumerable: true, get: function () { return async_install_1.dispatchAsyncInstall; } });
16
16
  Object.defineProperty(exports, "runAsyncInstallWorker", { enumerable: true, get: function () { return async_install_1.runAsyncInstallWorker; } });
17
- Object.defineProperty(exports, "isSandboxEnv", { enumerable: true, get: function () { return async_install_1.isSandboxEnv; } });
18
17
  Object.defineProperty(exports, "ASYNC_INSTALL_LOG", { enumerable: true, get: function () { return async_install_1.ASYNC_INSTALL_LOG; } });
@@ -8,10 +8,11 @@ const node_fs_1 = __importDefault(require("node:fs"));
8
8
  const node_path_1 = __importDefault(require("node:path"));
9
9
  const npm_pack_1 = require("../utils/npm-pack");
10
10
  const logger_1 = require("../utils/logger");
11
+ const env_1 = require("../utils/env");
11
12
  const STEERING_PACKAGE = '@lark-apaas/coding-steering';
12
13
  function inferMode() {
13
- // process.env.SANDBOX_ID 非空沙箱;其他(undefined / 空串)→ 本地
14
- return process.env.SANDBOX_ID ? 'sandbox' : 'local';
14
+ // 沙箱(MIAODA_DEP_CACHE_DIR 非空)→ sandbox;本地 local
15
+ return (0, env_1.isSandboxEnv)() ? 'sandbox' : 'local';
15
16
  }
16
17
  /**
17
18
  * 把 coding-steering 包内 <stack>/skills_common + 专有层(skills 或 skills_local)同步到
@@ -19,7 +20,7 @@ function inferMode() {
19
20
  *
20
21
  * 包内目录约定(每个 stack 三层):
21
22
  * <stack>/skills_common → 沙箱 + 本地都下发的共有层
22
- * <stack>/skills → 沙箱专有(沙箱端 update-skills.sh / SANDBOX_ID 非空时拿)
23
+ * <stack>/skills → 沙箱专有(沙箱端 update-skills.sh / mode=sandbox 时拿)
23
24
  * <stack>/skills_local → 本地专有(本地 dev / agent 环境拿)
24
25
  *
25
26
  * 下发组合(mode):
@@ -31,8 +32,8 @@ function inferMode() {
31
32
  * 'flat':拷到 .agents/skills/(平铺),tech.md → .agents/tech.md,并创建 .claude/skills
32
33
  * 软链指向 ../.agents/skills 让 Claude Code 识别同一份
33
34
  *
34
- * 同名 skill 覆盖顺序:common < 专有(专有覆盖 common 同名)。mode 缺省按 SANDBOX_ID env
35
- * 推断(沙箱平台运行时注入应用所属沙箱 ID;空 / undefined 则视为本地)。
35
+ * 同名 skill 覆盖顺序:common < 专有(专有覆盖 common 同名)。mode 缺省按 isSandboxEnv()
36
+ * 推断(MIAODA_DEP_CACHE_DIR 非空 → sandbox;空 / undefined → local)。
36
37
  *
37
38
  * 纯本地 atom(pull npm package + 拷贝文件),不属于任何 cli 域;放在 utils 让
38
39
  * app init handler 与独立 skills sync handler 都能复用。
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isSandboxEnv = isSandboxEnv;
4
+ /**
5
+ * 运行环境判定:当前进程是否跑在妙搭沙箱里。
6
+ *
7
+ * 口径:`process.env.MIAODA_DEP_CACHE_DIR` 非空(既非 undefined 也非空串)即为沙箱。
8
+ * 沙箱平台运行时会给应用进程注入依赖缓存目录;本地 dev / agent 环境拿不到该变量。
9
+ *
10
+ * 历史上用 `SANDBOX_ID` 判断,但该变量在部分沙箱场景下并不会注入,判断不可靠,已换成
11
+ * `MIAODA_DEP_CACHE_DIR`。注意:下发给 user app 的 `scripts/dev.sh` 仍按 `SANDBOX_ID`
12
+ * 判断(独立 bash 链路,不复用本函数)。
13
+ *
14
+ * 这是 CLI 运行时沙箱判定的 SSOT —— init outputLayout 分流、migrate 重启 dev process、
15
+ * coding-steering 同步 mode 推断、async-install 写 marker 都走这里,别再各处内联读环境变量。
16
+ */
17
+ function isSandboxEnv() {
18
+ return process.env.MIAODA_DEP_CACHE_DIR !== undefined && process.env.MIAODA_DEP_CACHE_DIR !== '';
19
+ }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.pollUntilDone = exports.msToSec = exports.msToNs = exports.parseToSec = exports.parseToNs = exports.parseToMs = exports.parseTimeToMs = exports.getInnerApi = exports.postInnerApi = exports.setRuntimeHttpClient = exports.setHttpClient = exports.resetHttpClient = exports.getRuntimeHttpClient = exports.getHttpClient = exports.log = exports.debug = exports.fmt = exports.isJsonMode = exports.emitPaged = exports.emitOk = exports.emitError = exports.emit = exports.getLogId = exports.generateLogId = exports.initConfigFromOpts = exports.resetConfig = exports.setConfig = exports.getConfig = exports.HttpError = exports.AppError = void 0;
3
+ exports.pollUntilDone = exports.msToSec = exports.msToNs = exports.parseToSec = exports.parseToNs = exports.parseToMs = exports.parseTimeToMs = exports.isSandboxEnv = exports.getInnerApi = exports.postInnerApi = exports.setRuntimeHttpClient = exports.setHttpClient = exports.resetHttpClient = exports.getRuntimeHttpClient = exports.getHttpClient = exports.log = exports.debug = exports.fmt = exports.isJsonMode = exports.emitPaged = exports.emitOk = exports.emitError = exports.emit = exports.getLogId = exports.generateLogId = exports.initConfigFromOpts = exports.resetConfig = exports.setConfig = exports.getConfig = exports.HttpError = exports.AppError = void 0;
4
4
  var error_1 = require("./error");
5
5
  Object.defineProperty(exports, "AppError", { enumerable: true, get: function () { return error_1.AppError; } });
6
6
  Object.defineProperty(exports, "HttpError", { enumerable: true, get: function () { return error_1.HttpError; } });
@@ -30,6 +30,8 @@ Object.defineProperty(exports, "setHttpClient", { enumerable: true, get: functio
30
30
  Object.defineProperty(exports, "setRuntimeHttpClient", { enumerable: true, get: function () { return http_1.setRuntimeHttpClient; } });
31
31
  Object.defineProperty(exports, "postInnerApi", { enumerable: true, get: function () { return http_1.postInnerApi; } });
32
32
  Object.defineProperty(exports, "getInnerApi", { enumerable: true, get: function () { return http_1.getInnerApi; } });
33
+ var env_1 = require("./env");
34
+ Object.defineProperty(exports, "isSandboxEnv", { enumerable: true, get: function () { return env_1.isSandboxEnv; } });
33
35
  var time_1 = require("./time");
34
36
  Object.defineProperty(exports, "parseTimeToMs", { enumerable: true, get: function () { return time_1.parseTimeToMs; } });
35
37
  Object.defineProperty(exports, "parseToMs", { enumerable: true, get: function () { return time_1.parseToMs; } });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lark-apaas/miaoda-cli",
3
- "version": "0.1.18",
3
+ "version": "0.1.19",
4
4
  "description": "Miaoda 平台命令行工具,面向 Agent 调用",
5
5
  "type": "commonjs",
6
6
  "bin": {