@lark-apaas/miaoda-cli 0.1.24-alpha.353f5fa → 0.1.24-alpha.fb2cf0a
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/app/index.js +5 -9
- package/dist/cli/handlers/app/init.js +17 -29
- package/dist/cli/handlers/app/sync.js +8 -26
- package/dist/config/migrate-configs/vite-react-to-nestjs-react-fullstack.js +0 -4
- package/dist/services/app/init/index.js +1 -2
- package/dist/services/app/init/template.js +1 -8
- package/dist/services/deploy/modern/pipelines/design-local.js +4 -0
- package/dist/services/deploy/modern/pipelines/local.js +4 -0
- package/package.json +1 -1
|
@@ -96,9 +96,6 @@ function registerAppSync(parent) {
|
|
|
96
96
|
action-plugin postinstall 在 npm install 时缺平台 env 的卡点(需要时再
|
|
97
97
|
FORCE_AUTHN_INNERAPI_DOMAIN=... npm install 手动跑一次)。
|
|
98
98
|
|
|
99
|
-
stack 未纳入 sync 范围(无 SyncConfig 且无 upgrade/templates/<stack>/,如 design-html
|
|
100
|
-
buildless 静态 HTML)→ 跳过同步(no-op, skipped=true),退出码 0,不阻断 dev/启动链路。
|
|
101
|
-
|
|
102
99
|
JSON 输出
|
|
103
100
|
{"data": {"stack": "...",
|
|
104
101
|
"appliedRules": [{"type": "...", "action": "...", "path": "...", "detail": "..."}],
|
|
@@ -106,7 +103,6 @@ JSON 输出
|
|
|
106
103
|
"mergedJsonFiles": [{"path": "...", "keys": [...]}],
|
|
107
104
|
"patchedScripts": [...],
|
|
108
105
|
"upgradedPackages": [{"name": "...", "from": "...", "to": "...", "section": "..."}]}}
|
|
109
|
-
跳过时:{"data": {"stack": "...", "skipped": true, "reason": "stack_not_in_sync_scope", ...空数组}}
|
|
110
106
|
|
|
111
107
|
示例
|
|
112
108
|
$ miaoda app sync
|
|
@@ -197,11 +193,11 @@ function registerAppInit(parent) {
|
|
|
197
193
|
source-path 不存在 → 报错;非 modern_html 传了 source-path → 警告并忽略,继续正常 init。
|
|
198
194
|
app_type 不写入 .spark/meta.json。
|
|
199
195
|
|
|
200
|
-
|
|
201
|
-
init
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
196
|
+
平台同步(upgrade/templates)
|
|
197
|
+
init 内嵌一次 upgrade/templates 同步(跟 app upgrade 共用同一份 util):
|
|
198
|
+
从 miaoda-cli 自带的 upgrade/templates/<stack>/ 同步 files/(覆盖)+ patches/
|
|
199
|
+
(JSON deep merge,含 scripts.dev:local 等)。目标 stack 未纳入 upgrade/templates/
|
|
200
|
+
时跳过(不报错)。后续要把 @lark-apaas/* 平台包统一指 latest,跑 'miaoda app upgrade'。
|
|
205
201
|
|
|
206
202
|
依赖安装
|
|
207
203
|
默认:npm install --no-audit --no-fund
|
|
@@ -60,16 +60,11 @@ async function handleAppInit(opts) {
|
|
|
60
60
|
const tplResult = (0, index_1.renderTemplate)({ stack, version, targetDir, projectName });
|
|
61
61
|
// source_path 导入:当前仅 app_type=modern_html 生效。渲染完模板后、装依赖前叠加进 src/。
|
|
62
62
|
const sourceImport = applySourcePathImport(opts, targetDir);
|
|
63
|
-
// 本地脚手架门禁:沙箱内所有栈照旧同步(nested,产出 .agent/);本地只有 LOCAL_STEERING_STACKS
|
|
64
|
-
// 白名单栈(nestjs-react-fullstack / vite-react)才落地 steering(.claude/.agents)与 logs/。
|
|
65
|
-
// html / design-html 是纯静态 / 设计产物,本地不需要这套 agent skills 脚手架,整段跳过。
|
|
66
|
-
const sandbox = (0, env_1.isSandboxEnv)();
|
|
67
|
-
const scaffoldSteering = sandbox || index_1.LOCAL_STEERING_STACKS.has(stack);
|
|
68
63
|
// 先建 logs/,防止 user 跑 dev 之前 AI/工具 redirect 到 logs/*.log 因为父目录不存在直接挂
|
|
69
64
|
// (dev.js / dev-local.js 自己也建 logs/,但只在它启动后;启动前的 shell redirect 会先于此)。
|
|
70
|
-
//
|
|
71
|
-
//
|
|
72
|
-
if (!
|
|
65
|
+
// 仅本地开发需要:沙箱环境由平台 supervisor 拉起 dev,无 init 前的 shell redirect 场景,
|
|
66
|
+
// 不预建 logs/ 以免在沙箱工作区留空目录。
|
|
67
|
+
if (!(0, env_1.isSandboxEnv)()) {
|
|
73
68
|
(0, logs_dir_1.ensureLogsDir)(targetDir);
|
|
74
69
|
}
|
|
75
70
|
// skills 同步软失败:拉不到 coding-steering 包不该阻断 writeSparkMeta /
|
|
@@ -79,28 +74,21 @@ async function handleAppInit(opts) {
|
|
|
79
74
|
// 跟沙箱端 update-skills.sh 链路对齐
|
|
80
75
|
// - 本地 → flat (.agents/skills + .claude/skills 软链),
|
|
81
76
|
// Agent / Claude Code 用同一份;nrf 在本地是主战场,vite-react 等也一样适用
|
|
82
|
-
const outputLayout =
|
|
83
|
-
|
|
84
|
-
// 与"拉不到 coding-steering 包"软失败路径共用同一份占位,emit / meta 落盘不受影响。
|
|
85
|
-
let steeringResult = {
|
|
86
|
-
version: 'unknown',
|
|
87
|
-
syncedSkills: [],
|
|
88
|
-
techSynced: false,
|
|
89
|
-
};
|
|
77
|
+
const outputLayout = (0, env_1.isSandboxEnv)() ? 'nested' : 'flat';
|
|
78
|
+
let steeringResult;
|
|
90
79
|
let steeringError;
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
}
|
|
80
|
+
try {
|
|
81
|
+
steeringResult = (0, coding_steering_1.syncCodingSteering)({
|
|
82
|
+
stack,
|
|
83
|
+
targetDir,
|
|
84
|
+
logPrefix: 'init',
|
|
85
|
+
outputLayout,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
steeringError = err instanceof Error ? err.message : String(err);
|
|
90
|
+
(0, logger_1.log)('init', `⚠ skills sync failed (continuing init): ${steeringError}`);
|
|
91
|
+
steeringResult = { version: 'unknown', syncedSkills: [], techSynced: false };
|
|
104
92
|
}
|
|
105
93
|
// 依赖安装:async 模式留到 meta 落盘后派发后台进程(不等装完),同步模式当场装。
|
|
106
94
|
// 同步:装模板钉死的依赖。不带 <pkg>@latest 位置参数,因此 npm 不会改写 package.json/lockfile
|
|
@@ -54,8 +54,7 @@ const MANAGED_PLATFORM_PACKAGES = {
|
|
|
54
54
|
* 执行流:
|
|
55
55
|
* 1. SyncRule[] 全量 apply —— 来自 src/config/sync-configs/<stack>.ts。每个 stack
|
|
56
56
|
* 自带模板资源在 upgrade/templates/<stack>/templates/。表里没有该 stack 时回退到
|
|
57
|
-
* 旧 platform-sync 兜底(兼容尚未迁移的 stack
|
|
58
|
-
* upgrade/templates/<stack>/)→ 跳过同步(no-op, skipped=true),不报错。
|
|
57
|
+
* 旧 platform-sync 兜底(兼容尚未迁移的 stack)。
|
|
59
58
|
* 2. 平台 deps 指 latest —— user app 已装的 @lark-apaas/* 按 MANAGED_PLATFORM_PACKAGES
|
|
60
59
|
* 白名单改写为 "latest"(紧急止血时表里可填具体版本)。
|
|
61
60
|
* 3. activateGitHooks —— 设置 core.hooksPath(template 自带 .githooks/pre-commit)。
|
|
@@ -72,31 +71,14 @@ async function handleAppSync(opts) {
|
|
|
72
71
|
if (meta.stack === undefined || meta.stack === '') {
|
|
73
72
|
throw new error_1.AppError('SYNC_META_INCOMPLETE', '.spark/meta.json missing stack — run `miaoda app init` first');
|
|
74
73
|
}
|
|
75
|
-
// 1. apply SyncRule[],stack 没注册时回退到旧 platform-sync
|
|
74
|
+
// 1. apply SyncRule[],stack 没注册时回退到旧 platform-sync 兜底;都不识别就报错
|
|
76
75
|
const syncResults = runStackSync(meta.stack, targetDir, 'sync');
|
|
77
|
-
// stack 未纳入 sync 范围(既无 SyncConfig 也无 upgrade/templates/<stack>/):跳过同步(no-op),
|
|
78
|
-
// 不报错。sync 会在 dev.sh 本地入口 / 沙箱 pod 启动阶段被调用,对不需要 cli 侧 sync 的 stack
|
|
79
|
-
// (如 design-html buildless 静态 HTML)不该阻断启动链路。
|
|
80
76
|
if (!syncResults.stackFound) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
(0, output_1.emit)({
|
|
86
|
-
data: {
|
|
87
|
-
stack: meta.stack,
|
|
88
|
-
skipped: true,
|
|
89
|
-
reason: 'stack_not_in_sync_scope',
|
|
90
|
-
appliedRules: [],
|
|
91
|
-
syncedFiles: [],
|
|
92
|
-
mergedJsonFiles: [],
|
|
93
|
-
patchedScripts: [],
|
|
94
|
-
upgradedPackages: [],
|
|
95
|
-
gitHooks: 'skipped',
|
|
96
|
-
installError: undefined,
|
|
97
|
-
},
|
|
77
|
+
throw new error_1.AppError('SYNC_STACK_NOT_SUPPORTED', `stack '${meta.stack}' has no SyncConfig and no upgrade/templates/${meta.stack}/ — 该 stack 暂未纳入 sync 范围`, {
|
|
78
|
+
next_actions: [
|
|
79
|
+
`src/config/sync-configs/${meta.stack}.ts 加 SyncConfig 并在 STACK_REGISTRY 注册`,
|
|
80
|
+
],
|
|
98
81
|
});
|
|
99
|
-
return;
|
|
100
82
|
}
|
|
101
83
|
// 2. activate git hooks(template 自带 .githooks/pre-commit,core.hooksPath 一次性设置)
|
|
102
84
|
const hookActivation = (0, githooks_1.activateGitHooks)(targetDir);
|
|
@@ -156,8 +138,8 @@ exports.handleAppUpgrade = handleAppSync;
|
|
|
156
138
|
* stack 在 STACK_REGISTRY 注册时走新 SyncRule 机制,否则回落到旧 platform-sync。
|
|
157
139
|
*
|
|
158
140
|
* stack 完全不识别(既不在 STACK_REGISTRY 也无 upgrade/templates/<stack>/ 目录)时返回
|
|
159
|
-
* `stackFound: false` 而非抛错 —— 让调用方按场景决定:sync handler
|
|
160
|
-
*
|
|
141
|
+
* `stackFound: false` 而非抛错 —— 让调用方按场景决定:sync handler 抛 AppError,init handler
|
|
142
|
+
* 允许(fresh init 时 stack 还在加注册的过渡期)。
|
|
161
143
|
*/
|
|
162
144
|
function runStackSync(stack, targetDir, logPrefix) {
|
|
163
145
|
const config = (0, sync_configs_1.getSyncConfig)(stack);
|
|
@@ -263,10 +263,6 @@ exports.MIGRATE_CONFIG = {
|
|
|
263
263
|
'dotenv',
|
|
264
264
|
// client-toolkit:替代 lite,业务代码 codemod 后走它
|
|
265
265
|
'@lark-apaas/client-toolkit',
|
|
266
|
-
// drizzle-orm —— `gen:db-schema` 生成的 server/database/schema.ts 从
|
|
267
|
-
// 'drizzle-orm/pg-core' / 'drizzle-orm' 导入 pgTable / sql 等 runtime API,
|
|
268
|
-
// 缺依赖时 nest build / dev 起来直接 ERR_MODULE_NOT_FOUND。
|
|
269
|
-
'drizzle-orm',
|
|
270
266
|
],
|
|
271
267
|
devDependencies: [
|
|
272
268
|
// nest start / nest build 必需
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ASYNC_INSTALL_LOG = exports.runAsyncInstallWorker = exports.dispatchAsyncInstall = exports.resolveNpmInstallRegistry = exports.installDependencies = exports.writeSparkMeta = exports.readSparkMeta = exports.IMPORT_SKIP_FILES = exports.IMPORT_SKIP_DIRS = exports.importSourceSrc = exports.TEMPLATE_PACKAGE_BY_STACK = exports.STACK_BY_APP_TYPE = exports.APP_TYPES = exports.
|
|
3
|
+
exports.ASYNC_INSTALL_LOG = exports.runAsyncInstallWorker = exports.dispatchAsyncInstall = exports.resolveNpmInstallRegistry = exports.installDependencies = exports.writeSparkMeta = exports.readSparkMeta = exports.IMPORT_SKIP_FILES = exports.IMPORT_SKIP_DIRS = exports.importSourceSrc = exports.TEMPLATE_PACKAGE_BY_STACK = exports.STACK_BY_APP_TYPE = exports.APP_TYPES = exports.SUPPORTED_STACKS = exports.resolveStack = 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, "resolveStack", { enumerable: true, get: function () { return template_1.resolveStack; } });
|
|
7
7
|
Object.defineProperty(exports, "SUPPORTED_STACKS", { enumerable: true, get: function () { return template_1.SUPPORTED_STACKS; } });
|
|
8
|
-
Object.defineProperty(exports, "LOCAL_STEERING_STACKS", { enumerable: true, get: function () { return template_1.LOCAL_STEERING_STACKS; } });
|
|
9
8
|
Object.defineProperty(exports, "APP_TYPES", { enumerable: true, get: function () { return template_1.APP_TYPES; } });
|
|
10
9
|
Object.defineProperty(exports, "STACK_BY_APP_TYPE", { enumerable: true, get: function () { return template_1.STACK_BY_APP_TYPE; } });
|
|
11
10
|
Object.defineProperty(exports, "TEMPLATE_PACKAGE_BY_STACK", { enumerable: true, get: function () { return template_1.TEMPLATE_PACKAGE_BY_STACK; } });
|
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.APP_TYPES = exports.STACK_BY_APP_TYPE = exports.
|
|
6
|
+
exports.APP_TYPES = exports.STACK_BY_APP_TYPE = exports.SUPPORTED_STACKS = exports.TEMPLATE_PINNED_VERSION_BY_STACK = exports.TEMPLATE_PACKAGE_BY_STACK = void 0;
|
|
7
7
|
exports.resolveStack = resolveStack;
|
|
8
8
|
exports.renderTemplate = renderTemplate;
|
|
9
9
|
const node_fs_1 = __importDefault(require("node:fs"));
|
|
@@ -27,13 +27,6 @@ exports.TEMPLATE_PACKAGE_BY_STACK = {
|
|
|
27
27
|
*/
|
|
28
28
|
exports.TEMPLATE_PINNED_VERSION_BY_STACK = {};
|
|
29
29
|
exports.SUPPORTED_STACKS = Object.keys(exports.TEMPLATE_PACKAGE_BY_STACK);
|
|
30
|
-
/**
|
|
31
|
-
* 本地开发(非沙箱)需要落地 agent skills 脚手架(.claude/.agents)与 logs/ 的 stack 白名单。
|
|
32
|
-
* 只有这些全栈 / 前端框架栈在本地才需要 coding-steering 的 skills;html / design-html 是纯
|
|
33
|
-
* 静态 / 设计产物,本地无需这套脚手架,init 直接跳过 syncCodingSteering 与 logs 创建。
|
|
34
|
-
* 沙箱环境不受此白名单约束(所有栈照旧走 nested 同步,产出 .agent/)。
|
|
35
|
-
*/
|
|
36
|
-
exports.LOCAL_STEERING_STACKS = new Set(['nestjs-react-fullstack', 'vite-react']);
|
|
37
30
|
/**
|
|
38
31
|
* app_type(业务类型)→ stack 短名映射。仅在调用方未显式传 --template 时用于解析 stack。
|
|
39
32
|
* 与 src/api/app/types.ts 的 AppType 枚举无关,是独立的业务类型概念。
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.designLocalPublishPipeline = designLocalPublishPipeline;
|
|
4
|
+
const spark_meta_1 = require("../../../../utils/spark-meta");
|
|
4
5
|
const error_1 = require("../../../../utils/error");
|
|
5
6
|
const logger_1 = require("../../../../utils/logger");
|
|
6
7
|
const index_1 = require("../atoms/index");
|
|
@@ -37,6 +38,9 @@ async function designLocalPublishPipeline(opts) {
|
|
|
37
38
|
await (0, index_1.finalizeLocalRelease)(ctx.appId, release.releaseID, index_1.LocalReleaseStatus.Failed);
|
|
38
39
|
throw err;
|
|
39
40
|
}
|
|
41
|
+
if (release.onlineUrl !== undefined && release.onlineUrl !== '') {
|
|
42
|
+
(0, spark_meta_1.writeSparkMeta)(ctx.projectDir, { appUrl: release.onlineUrl });
|
|
43
|
+
}
|
|
40
44
|
(0, logger_1.log)('deploy', 'Deployed successfully');
|
|
41
45
|
return {
|
|
42
46
|
appId: ctx.appId,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.localBuildLocalPublishPipeline = localBuildLocalPublishPipeline;
|
|
4
|
+
const spark_meta_1 = require("../../../../utils/spark-meta");
|
|
4
5
|
const error_1 = require("../../../../utils/error");
|
|
5
6
|
const logger_1 = require("../../../../utils/logger");
|
|
6
7
|
const index_1 = require("../atoms/index");
|
|
@@ -63,6 +64,9 @@ async function localBuildLocalPublishPipeline(opts) {
|
|
|
63
64
|
await (0, index_1.finalizeLocalRelease)(ctx.appId, release.releaseID, index_1.LocalReleaseStatus.Failed);
|
|
64
65
|
throw err;
|
|
65
66
|
}
|
|
67
|
+
if (release.onlineUrl !== undefined && release.onlineUrl !== '') {
|
|
68
|
+
(0, spark_meta_1.writeSparkMeta)(ctx.projectDir, { appUrl: release.onlineUrl });
|
|
69
|
+
}
|
|
66
70
|
(0, logger_1.log)('deploy', 'Deployed successfully');
|
|
67
71
|
return {
|
|
68
72
|
appId: ctx.appId,
|