@lark-apaas/miaoda-cli 0.1.5-alpha.156c7a1 → 0.1.5-alpha.2f1e0ff
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/cli/commands/skills/index.js +18 -2
- package/dist/cli/handlers/app/sync.js +7 -7
- package/dist/cli/handlers/skills/sync.js +4 -0
- package/dist/config/fullstack-cli-pin.js +1 -1
- package/dist/config/sync-configs/design-stack.js +1 -1
- package/dist/config/sync-configs/nestjs-react-fullstack.js +5 -4
- package/dist/services/app/init/install.js +16 -1
- package/dist/utils/coding-steering.js +96 -21
- package/package.json +1 -1
- package/upgrade/templates/design-stack/templates/scripts/dev.sh +8 -11
- package/upgrade/templates/nestjs-react-fullstack/templates/scripts/dev.sh +8 -11
- package/upgrade/templates/nestjs-react-fullstack/templates/tsconfig.node.json +1 -1
|
@@ -21,18 +21,33 @@ function registerSkillsCommands(program) {
|
|
|
21
21
|
function registerSkillsSync(parent) {
|
|
22
22
|
const cmd = parent
|
|
23
23
|
.command('sync')
|
|
24
|
-
.description('同步 coding-steering(latest 或指定版本)到
|
|
24
|
+
.description('同步 coding-steering(latest 或指定版本)到 user app')
|
|
25
25
|
.argument('[version]', 'coding-steering 包版本或 dist-tag,缺省 latest')
|
|
26
26
|
.option('--dir <path>', '项目目录,默认当前目录', '.')
|
|
27
|
+
.option('--local', '走本地 dev / agent 输出形态:拷到 .agents/skills 平铺 + 创建 .claude/skills 软链。' +
|
|
28
|
+
'不传时退回老形态:拷到 .agent/skills/steering/<stack>/skills/(跟沙箱端 update-skills.sh 对齐)', false)
|
|
27
29
|
.addHelpText('after', `
|
|
28
30
|
前置要求
|
|
29
31
|
当前目录(或 --dir)已走过 'miaoda app init'(.spark/meta.json 含 stack)
|
|
30
32
|
|
|
33
|
+
输出形态(--local 切换)
|
|
34
|
+
默认(不传 --local):
|
|
35
|
+
.agent/skills/steering/<stack>/skills/<skill>/...
|
|
36
|
+
.agent/skills/steering/<stack>/tech.md
|
|
37
|
+
(老链路,沙箱端 update-skills.sh 也输出这套结构)
|
|
38
|
+
|
|
39
|
+
传 --local:
|
|
40
|
+
.agents/skills/<skill>/... ← 平铺,无 stack 命名空间
|
|
41
|
+
.agents/tech.md
|
|
42
|
+
.claude/skills → ../.agents/skills(软链,让 Claude Code 识别同一份)
|
|
43
|
+
|
|
31
44
|
JSON 输出
|
|
32
|
-
{"data": {"stack": "...", "version": "...", "syncedSkills": [...], "techSynced": true|false
|
|
45
|
+
{"data": {"stack": "...", "version": "...", "syncedSkills": [...], "techSynced": true|false,
|
|
46
|
+
"claudeSkillsLink": "created|updated|noop|conflict" // 仅 --local 时}}
|
|
33
47
|
|
|
34
48
|
示例
|
|
35
49
|
$ miaoda skills sync
|
|
50
|
+
$ miaoda skills sync --local # 本地 dev / agent 用
|
|
36
51
|
$ miaoda skills sync 0.2.0
|
|
37
52
|
$ miaoda skills sync --dir ./my-app
|
|
38
53
|
`);
|
|
@@ -40,6 +55,7 @@ JSON 输出
|
|
|
40
55
|
await (0, index_1.handleSkillsSync)({
|
|
41
56
|
dir: rawOpts.dir,
|
|
42
57
|
version,
|
|
58
|
+
local: rawOpts.local,
|
|
43
59
|
});
|
|
44
60
|
}));
|
|
45
61
|
}
|
|
@@ -31,13 +31,13 @@ const logger_1 = require("../../../utils/logger");
|
|
|
31
31
|
* 改这张表请同步把 user app 端到端 smoke 跑一次(init → sync → npm run dev)。
|
|
32
32
|
*/
|
|
33
33
|
const PINNED_PLATFORM_VERSIONS = {
|
|
34
|
-
'@lark-apaas/express-core': '1.0.4-alpha.
|
|
35
|
-
'@lark-apaas/fullstack-nestjs-core': '1.1.52-alpha.
|
|
36
|
-
'@lark-apaas/fullstack-vite-preset': '1.0.24-alpha.
|
|
37
|
-
'@lark-apaas/http-client': '0.1.7-alpha.
|
|
38
|
-
'@lark-apaas/fullstack-cli': '1.1.
|
|
39
|
-
'@lark-apaas/fullstack-rspack-preset': '1.0.56-alpha.
|
|
40
|
-
'@lark-apaas/db-schema-sync': '0.1.6-alpha.
|
|
34
|
+
'@lark-apaas/express-core': '1.0.4-alpha.7',
|
|
35
|
+
'@lark-apaas/fullstack-nestjs-core': '1.1.52-alpha.1',
|
|
36
|
+
'@lark-apaas/fullstack-vite-preset': '1.0.24-alpha.9',
|
|
37
|
+
'@lark-apaas/http-client': '0.1.7-alpha.8',
|
|
38
|
+
'@lark-apaas/fullstack-cli': '1.1.49-alpha.0',
|
|
39
|
+
'@lark-apaas/fullstack-rspack-preset': '1.0.56-alpha.8',
|
|
40
|
+
'@lark-apaas/db-schema-sync': '0.1.6-alpha.2',
|
|
41
41
|
};
|
|
42
42
|
/**
|
|
43
43
|
* miaoda app sync [--dir <path>]
|
|
@@ -32,6 +32,7 @@ async function handleSkillsSync(opts) {
|
|
|
32
32
|
stack: meta.stack,
|
|
33
33
|
targetDir,
|
|
34
34
|
version,
|
|
35
|
+
outputLayout: opts.local === true ? 'flat' : 'nested',
|
|
35
36
|
});
|
|
36
37
|
(0, output_1.emit)({
|
|
37
38
|
data: {
|
|
@@ -40,6 +41,9 @@ async function handleSkillsSync(opts) {
|
|
|
40
41
|
versionSource,
|
|
41
42
|
syncedSkills: result.syncedSkills,
|
|
42
43
|
techSynced: result.techSynced,
|
|
44
|
+
...(result.claudeSkillsLink !== undefined
|
|
45
|
+
? { claudeSkillsLink: result.claudeSkillsLink }
|
|
46
|
+
: {}),
|
|
43
47
|
},
|
|
44
48
|
});
|
|
45
49
|
}
|
|
@@ -14,4 +14,4 @@ exports.FULLSTACK_CLI_PIN_SPEC = void 0;
|
|
|
14
14
|
* **保持一致**(前者用于 user app dependencies dep bump,后者用于 npm script 里 npx 调用)
|
|
15
15
|
* - 一旦 latest fullstack-cli 稳定且 token 鉴权回归 OK,可以去掉版本钉,让 npx 走 latest
|
|
16
16
|
*/
|
|
17
|
-
exports.FULLSTACK_CLI_PIN_SPEC = '@lark-apaas/fullstack-cli@1.1.
|
|
17
|
+
exports.FULLSTACK_CLI_PIN_SPEC = '@lark-apaas/fullstack-cli@1.1.49-alpha.0';
|
|
@@ -86,7 +86,7 @@ exports.SYNC_CONFIG = {
|
|
|
86
86
|
ifStartsWith: 'npm run upgrade && ',
|
|
87
87
|
},
|
|
88
88
|
// ===== miaoda-cli 本地开发新增规则 =====
|
|
89
|
-
// M1. scripts.dev:local —— 本地用户绕过
|
|
89
|
+
// M1. scripts.dev:local —— 本地用户绕过 SANDBOX_ID 分发直接跑本地链路(npm run dev:local)。
|
|
90
90
|
{
|
|
91
91
|
type: 'add-script',
|
|
92
92
|
name: 'dev:local',
|
|
@@ -129,8 +129,9 @@ exports.SYNC_CONFIG = {
|
|
|
129
129
|
ifStartsWith: 'concurrently ',
|
|
130
130
|
},
|
|
131
131
|
// 10. 把老 `npm run upgrade && ./scripts/dev.sh` 形式迁移到 `./scripts/dev.sh`,
|
|
132
|
-
// 让本地 `npm run dev` 不再前置跑 fullstack-cli sync
|
|
133
|
-
//
|
|
132
|
+
// 让本地 `npm run dev` 不再前置跑 fullstack-cli sync。新版 dev.sh 按 SANDBOX_ID 是否非空
|
|
133
|
+
// 判分支:沙箱直接 exec dev.js(脚本同步由平台 pod 启动时做过,dev 入口不再 upgrade);
|
|
134
|
+
// 本地走 miaoda app sync 兜底 + dev-local.sh。
|
|
134
135
|
{
|
|
135
136
|
type: 'patch-script',
|
|
136
137
|
name: 'dev',
|
|
@@ -153,8 +154,8 @@ exports.SYNC_CONFIG = {
|
|
|
153
154
|
ifStartsWith: 'npx -y @lark-apaas/fullstack-cli sync',
|
|
154
155
|
},
|
|
155
156
|
// ===== miaoda-cli 本地开发新增规则(fullstack-cli sync 不会执行) =====
|
|
156
|
-
// M1. scripts.dev:local —— 本地用户绕过
|
|
157
|
-
// dev.sh 在
|
|
157
|
+
// M1. scripts.dev:local —— 本地用户绕过 SANDBOX_ID 分发直接跑本地链路(npm run dev:local)。
|
|
158
|
+
// dev.sh 在 SANDBOX_ID 非空时跑 dev.js(沙箱保活)、否则 exec dev-local.sh;显式 dev:local
|
|
158
159
|
// 用于 agent 在本地稳定调试,不受任何 env 影响。
|
|
159
160
|
{
|
|
160
161
|
type: 'add-script',
|
|
@@ -102,7 +102,22 @@ function extractZip(zipPath, targetDir, stdio) {
|
|
|
102
102
|
});
|
|
103
103
|
}
|
|
104
104
|
}
|
|
105
|
+
/**
|
|
106
|
+
* 显式钉死 npmmirror。原因:
|
|
107
|
+
* - user 全局 `~/.npmrc` 千奇百怪(bnpm / npmjs / 自定义代理),npm config 层叠下
|
|
108
|
+
* CLI flag 优先级最高,写在这里能盖掉所有上游配置,行为可预测。
|
|
109
|
+
* - 模板 `_npmrc → .npmrc` 虽然项目级 registry 写得是 npmmirror,但只在 cwd 含 .npmrc
|
|
110
|
+
* 时才生效,env / CLI 层先到先得,落到这里钉死最稳。
|
|
111
|
+
* - 字节内网 DNS 会把 npmmirror 域名透明指向公司镜像,外网就是公网阿里源;同一行配置
|
|
112
|
+
* 在两套环境都拉得到 @lark-apaas/* 私包(内网经公司镜像,外网经阿里同步过去的副本)。
|
|
113
|
+
* - 留 `MIAODA_NPM_REGISTRY` env 应急覆盖。
|
|
114
|
+
*/
|
|
115
|
+
const NPM_INSTALL_REGISTRY_DEFAULT = 'https://registry.npmmirror.com/';
|
|
105
116
|
function runNpmInstall(targetDir, stdio) {
|
|
106
117
|
(0, logger_1.log)('init', `npm install in ${targetDir}...`);
|
|
107
|
-
|
|
118
|
+
const registry = process.env.MIAODA_NPM_REGISTRY ?? NPM_INSTALL_REGISTRY_DEFAULT;
|
|
119
|
+
(0, node_child_process_1.execFileSync)('npm', ['install', '--no-audit', '--no-fund', '--registry', registry], {
|
|
120
|
+
cwd: targetDir,
|
|
121
|
+
stdio,
|
|
122
|
+
});
|
|
108
123
|
}
|
|
@@ -14,15 +14,30 @@ const STEERING_PACKAGE = '@lark-apaas/coding-steering';
|
|
|
14
14
|
// 用户显式传具体版本(如 `miaoda skills sync 0.2.0`)仍 override 这个默认值。
|
|
15
15
|
// 升基线时:跑端到端 smoke(init → skills sync → 看 skills 内容)→ 改这个常量。
|
|
16
16
|
const DEFAULT_PINNED_VERSION = '0.1.6-alpha.10';
|
|
17
|
+
function inferMode() {
|
|
18
|
+
// process.env.SANDBOX_ID 非空 → 沙箱;其他(undefined / 空串)→ 本地
|
|
19
|
+
return process.env.SANDBOX_ID ? 'sandbox' : 'local';
|
|
20
|
+
}
|
|
17
21
|
/**
|
|
18
|
-
* 把 coding-steering 包内
|
|
19
|
-
*
|
|
20
|
-
*
|
|
22
|
+
* 把 coding-steering 包内 <stack>/skills_common + 专有层(skills 或 skills_local)同步到
|
|
23
|
+
* user app。
|
|
24
|
+
*
|
|
25
|
+
* 包内目录约定(每个 stack 三层):
|
|
26
|
+
* <stack>/skills_common → 沙箱 + 本地都下发的共有层
|
|
27
|
+
* <stack>/skills → 沙箱专有(沙箱端 update-skills.sh / SANDBOX_ID 非空时拿)
|
|
28
|
+
* <stack>/skills_local → 本地专有(本地 dev / agent 环境拿)
|
|
29
|
+
*
|
|
30
|
+
* 下发组合(mode):
|
|
31
|
+
* mode='sandbox' → skills_common + skills
|
|
32
|
+
* mode='local' → skills_common + skills_local
|
|
21
33
|
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
34
|
+
* 目标路径形态(outputLayout):
|
|
35
|
+
* 'nested' (默认,向后兼容):拷到 .agent/skills/steering/<stack>/skills/,tech.md 同目录
|
|
36
|
+
* 'flat':拷到 .agents/skills/(平铺),tech.md → .agents/tech.md,并创建 .claude/skills
|
|
37
|
+
* 软链指向 ../.agents/skills 让 Claude Code 识别同一份
|
|
38
|
+
*
|
|
39
|
+
* 同名 skill 覆盖顺序:common < 专有(专有覆盖 common 同名)。mode 缺省按 SANDBOX_ID env
|
|
40
|
+
* 推断(沙箱平台运行时注入应用所属沙箱 ID;空 / undefined 则视为本地)。
|
|
26
41
|
*
|
|
27
42
|
* 纯本地 atom(pull npm package + 拷贝文件),不属于任何 cli 域;放在 utils 让
|
|
28
43
|
* app init handler 与独立 skills sync handler 都能复用。
|
|
@@ -30,7 +45,9 @@ const DEFAULT_PINNED_VERSION = '0.1.6-alpha.10';
|
|
|
30
45
|
function syncCodingSteering(opts) {
|
|
31
46
|
const logPrefix = opts.logPrefix ?? 'skills';
|
|
32
47
|
const effectiveVersion = opts.version ?? DEFAULT_PINNED_VERSION;
|
|
33
|
-
|
|
48
|
+
const mode = opts.mode ?? inferMode();
|
|
49
|
+
const layout = opts.outputLayout ?? 'nested';
|
|
50
|
+
(0, logger_1.log)(logPrefix, `Fetching ${STEERING_PACKAGE}@${effectiveVersion} (mode=${mode}, layout=${layout})...`);
|
|
34
51
|
const fetched = (0, npm_pack_1.fetchNpmPackage)({
|
|
35
52
|
packageName: STEERING_PACKAGE,
|
|
36
53
|
version: effectiveVersion,
|
|
@@ -38,25 +55,32 @@ function syncCodingSteering(opts) {
|
|
|
38
55
|
try {
|
|
39
56
|
const steeringRoot = node_path_1.default.join(fetched.extractDir, 'steering');
|
|
40
57
|
const stackDir = node_path_1.default.join(steeringRoot, opts.stack);
|
|
41
|
-
|
|
42
|
-
//
|
|
43
|
-
//
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
58
|
+
// 目标路径按 layout 切:
|
|
59
|
+
// nested → .agent/skills/steering/<stack>/{skills, tech.md}(老链路、stack 命名空间)
|
|
60
|
+
// flat → .agents/{skills, tech.md}(平铺,无 stack 命名空间,跟 .claude/skills 软链对齐)
|
|
61
|
+
const { dstSkillsDir, dstTechPath } = layout === 'flat'
|
|
62
|
+
? {
|
|
63
|
+
dstSkillsDir: node_path_1.default.join(opts.targetDir, '.agents', 'skills'),
|
|
64
|
+
dstTechPath: node_path_1.default.join(opts.targetDir, '.agents', 'tech.md'),
|
|
65
|
+
}
|
|
66
|
+
: {
|
|
67
|
+
dstSkillsDir: node_path_1.default.join(opts.targetDir, '.agent', 'skills', 'steering', opts.stack, 'skills'),
|
|
68
|
+
dstTechPath: node_path_1.default.join(opts.targetDir, '.agent', 'skills', 'steering', opts.stack, 'tech.md'),
|
|
69
|
+
};
|
|
47
70
|
node_fs_1.default.mkdirSync(dstSkillsDir, { recursive: true });
|
|
48
71
|
let techSynced = false;
|
|
49
72
|
const techSrc = node_path_1.default.join(stackDir, 'tech.md');
|
|
50
73
|
if (node_fs_1.default.existsSync(techSrc)) {
|
|
51
|
-
node_fs_1.default.
|
|
74
|
+
node_fs_1.default.mkdirSync(node_path_1.default.dirname(dstTechPath), { recursive: true });
|
|
75
|
+
node_fs_1.default.copyFileSync(techSrc, dstTechPath);
|
|
52
76
|
techSynced = true;
|
|
53
77
|
}
|
|
54
78
|
const synced = [];
|
|
55
|
-
//
|
|
79
|
+
// 顺序拷贝,后者覆盖前者:skills_common 铺底,专有层(skills 或 skills_local)覆盖同名
|
|
80
|
+
const exclusiveLayer = mode === 'sandbox' ? 'skills' : 'skills_local';
|
|
56
81
|
const layers = [
|
|
57
|
-
{ dir:
|
|
58
|
-
{ dir: node_path_1.default.join(stackDir,
|
|
59
|
-
{ dir: node_path_1.default.join(stackDir, 'skills_local'), label: `${opts.stack}/skills_local` },
|
|
82
|
+
{ dir: node_path_1.default.join(stackDir, 'skills_common'), label: `${opts.stack}/skills_common` },
|
|
83
|
+
{ dir: node_path_1.default.join(stackDir, exclusiveLayer), label: `${opts.stack}/${exclusiveLayer}` },
|
|
60
84
|
];
|
|
61
85
|
for (const layer of layers) {
|
|
62
86
|
if (!node_fs_1.default.existsSync(layer.dir))
|
|
@@ -72,13 +96,64 @@ function syncCodingSteering(opts) {
|
|
|
72
96
|
synced.push(`${layer.label}/${name}`);
|
|
73
97
|
}
|
|
74
98
|
}
|
|
75
|
-
|
|
76
|
-
|
|
99
|
+
let claudeSkillsLink;
|
|
100
|
+
if (layout === 'flat') {
|
|
101
|
+
claudeSkillsLink = ensureClaudeSkillsSymlink(opts.targetDir, logPrefix);
|
|
102
|
+
}
|
|
103
|
+
(0, logger_1.log)(logPrefix, `Synced ${String(synced.length)} skill(s), tech.md ${techSynced ? 'yes' : 'no'} (mode=${mode}, layout=${layout})`);
|
|
104
|
+
return {
|
|
105
|
+
version: fetched.version,
|
|
106
|
+
syncedSkills: synced,
|
|
107
|
+
techSynced,
|
|
108
|
+
...(claudeSkillsLink !== undefined ? { claudeSkillsLink } : {}),
|
|
109
|
+
};
|
|
77
110
|
}
|
|
78
111
|
finally {
|
|
79
112
|
fetched.cleanup();
|
|
80
113
|
}
|
|
81
114
|
}
|
|
115
|
+
/**
|
|
116
|
+
* flat layout 下创建 `<targetDir>/.claude/skills` 软链 → `../.agents/skills`,让 Claude Code
|
|
117
|
+
* 默认的 skills 加载路径跟 user app 的 .agents/skills 是同一份内容。
|
|
118
|
+
*
|
|
119
|
+
* 用相对路径软链(不是 absolute)—— user app 移动目录 / clone 到别处不会断链。
|
|
120
|
+
*
|
|
121
|
+
* 处理 4 种已有状态:
|
|
122
|
+
* - 已是软链且指向对的:noop
|
|
123
|
+
* - 已是软链但指错地方:删旧的,建新的(updated)
|
|
124
|
+
* - 已是普通目录 / 文件:不覆盖,警告并跳过(conflict)—— 用户可能手动放了别的 skills
|
|
125
|
+
* - 不存在:建新的(created)
|
|
126
|
+
*/
|
|
127
|
+
function ensureClaudeSkillsSymlink(targetDir, logPrefix) {
|
|
128
|
+
const linkPath = node_path_1.default.join(targetDir, '.claude', 'skills');
|
|
129
|
+
const linkTarget = node_path_1.default.join('..', '.agents', 'skills');
|
|
130
|
+
node_fs_1.default.mkdirSync(node_path_1.default.dirname(linkPath), { recursive: true });
|
|
131
|
+
let existing = null;
|
|
132
|
+
try {
|
|
133
|
+
existing = node_fs_1.default.lstatSync(linkPath);
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
if (err.code !== 'ENOENT')
|
|
137
|
+
throw err;
|
|
138
|
+
}
|
|
139
|
+
if (existing === null) {
|
|
140
|
+
node_fs_1.default.symlinkSync(linkTarget, linkPath, 'dir');
|
|
141
|
+
(0, logger_1.log)(logPrefix, ` ✓ .claude/skills → ${linkTarget} (symlink created)`);
|
|
142
|
+
return 'created';
|
|
143
|
+
}
|
|
144
|
+
if (existing.isSymbolicLink()) {
|
|
145
|
+
const current = node_fs_1.default.readlinkSync(linkPath);
|
|
146
|
+
if (current === linkTarget) {
|
|
147
|
+
return 'noop';
|
|
148
|
+
}
|
|
149
|
+
node_fs_1.default.unlinkSync(linkPath);
|
|
150
|
+
node_fs_1.default.symlinkSync(linkTarget, linkPath, 'dir');
|
|
151
|
+
(0, logger_1.log)(logPrefix, ` ✓ .claude/skills → ${linkTarget} (symlink updated, was → ${current})`);
|
|
152
|
+
return 'updated';
|
|
153
|
+
}
|
|
154
|
+
(0, logger_1.log)(logPrefix, ` ⚠ .claude/skills 已是普通目录/文件,跳过软链创建`);
|
|
155
|
+
return 'conflict';
|
|
156
|
+
}
|
|
82
157
|
function copyDir(src, dest) {
|
|
83
158
|
node_fs_1.default.mkdirSync(dest, { recursive: true });
|
|
84
159
|
for (const entry of node_fs_1.default.readdirSync(src, { withFileTypes: true })) {
|
package/package.json
CHANGED
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# `npm run dev` 入口;按
|
|
3
|
-
# -
|
|
4
|
-
# (保活 / restart loop / 文件日志 ——
|
|
5
|
-
#
|
|
6
|
-
#
|
|
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.sh:纯 stdout、崩了就崩、Agent 友好。
|
|
7
|
+
# 显式想跑本地路径可用 `npm run dev:local`(绕过 SANDBOX_ID 判断)。
|
|
7
8
|
set -euo pipefail
|
|
8
9
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
9
10
|
|
|
10
|
-
if [
|
|
11
|
-
# 沙箱前置同步:fullstack-cli sync 把平台管控的 scripts/ + 部分 package.json 字段同步过来。
|
|
12
|
-
# 不直接调 `fullstack-cli`,走 `npm run upgrade` 享 package.json 里的入口定义(与 prepublish
|
|
13
|
-
# 之类的钩子一致);后续若 upgrade 脚本换实现,dev 路径自动跟随。
|
|
14
|
-
npm run upgrade
|
|
11
|
+
if [ -n "${SANDBOX_ID:-}" ]; then
|
|
15
12
|
exec node "$SCRIPT_DIR/dev.js" "$@"
|
|
16
13
|
fi
|
|
17
14
|
|
|
@@ -21,7 +18,7 @@ if [ ! -x "$SCRIPT_DIR/dev-local.sh" ]; then
|
|
|
21
18
|
fi
|
|
22
19
|
|
|
23
20
|
# 本地启动前先跑一次 miaoda app sync:同步 platform-controlled 内容 + 升 @lark-apaas/* 到
|
|
24
|
-
# 钉版 + 迁移老 npm scripts。沙箱不走这里(
|
|
21
|
+
# 钉版 + 迁移老 npm scripts。沙箱不走这里(SANDBOX_ID 分支已经 exec return)。
|
|
25
22
|
# 走 npx 不依赖用户全局装 miaoda;钉到 @alpha dist-tag 跟随最新发布。
|
|
26
23
|
npx -y @lark-apaas/miaoda-cli@alpha app sync || echo "[dev] miaoda app sync 失败,按现状继续" >&2
|
|
27
24
|
|
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# `npm run dev` 入口;按
|
|
3
|
-
# -
|
|
4
|
-
# (保活 / restart loop / 文件日志 ——
|
|
5
|
-
#
|
|
6
|
-
#
|
|
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.sh:纯 stdout、崩了就崩、Agent 友好。
|
|
7
|
+
# 显式想跑本地路径可用 `npm run dev:local`(绕过 SANDBOX_ID 判断)。
|
|
7
8
|
set -euo pipefail
|
|
8
9
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
9
10
|
|
|
10
|
-
if [
|
|
11
|
-
# 沙箱前置同步:fullstack-cli sync 把平台管控的 scripts/ + 部分 package.json 字段同步过来。
|
|
12
|
-
# 不直接调 `fullstack-cli`,走 `npm run upgrade` 享 package.json 里的入口定义(与 prepublish
|
|
13
|
-
# 之类的钩子一致);后续若 upgrade 脚本换实现,dev 路径自动跟随。
|
|
14
|
-
npm run upgrade
|
|
11
|
+
if [ -n "${SANDBOX_ID:-}" ]; then
|
|
15
12
|
exec node "$SCRIPT_DIR/dev.js" "$@"
|
|
16
13
|
fi
|
|
17
14
|
|
|
@@ -21,7 +18,7 @@ if [ ! -x "$SCRIPT_DIR/dev-local.sh" ]; then
|
|
|
21
18
|
fi
|
|
22
19
|
|
|
23
20
|
# 本地启动前先跑一次 miaoda app sync:同步 platform-controlled 内容 + 升 @lark-apaas/* 到
|
|
24
|
-
# 钉版 + 迁移老 npm scripts。沙箱不走这里(
|
|
21
|
+
# 钉版 + 迁移老 npm scripts。沙箱不走这里(SANDBOX_ID 分支已经 exec return)。
|
|
25
22
|
# 走 npx 不依赖用户全局装 miaoda;钉到 @alpha dist-tag 跟随最新发布。
|
|
26
23
|
npx -y @lark-apaas/miaoda-cli@alpha app sync || echo "[dev] miaoda app sync 失败,按现状继续" >&2
|
|
27
24
|
|