@lark-apaas/miaoda-cli 0.1.4 → 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/README.md +6 -5
- package/dist/api/deploy/index.js +13 -1
- package/dist/api/deploy/modern-types.js +23 -0
- package/dist/api/deploy/modern.js +78 -0
- package/dist/api/deploy/plugin-instances-types.js +6 -0
- package/dist/api/deploy/plugin-instances.js +22 -0
- package/dist/api/observability/api.js +10 -0
- package/dist/api/observability/index.js +2 -1
- package/dist/cli/commands/app/index.js +144 -2
- package/dist/cli/commands/deploy/modern.js +50 -0
- package/dist/cli/commands/index.js +68 -5
- package/dist/cli/commands/observability/index.js +62 -6
- package/dist/cli/commands/shared.js +5 -0
- package/dist/cli/commands/skills/index.js +79 -0
- package/dist/cli/handlers/app/index.js +9 -1
- package/dist/cli/handlers/app/init.js +132 -0
- package/dist/cli/handlers/app/sync.js +215 -0
- package/dist/cli/handlers/deploy/modern.js +33 -0
- package/dist/cli/handlers/observability/helpers.js +4 -0
- package/dist/cli/handlers/observability/index.js +3 -1
- package/dist/cli/handlers/observability/log.js +8 -2
- package/dist/cli/handlers/observability/source-stack.js +389 -0
- package/dist/cli/handlers/observability/trace.js +7 -1
- package/dist/cli/handlers/skills/index.js +7 -0
- package/dist/cli/handlers/skills/status.js +31 -0
- package/dist/cli/handlers/skills/sync.js +49 -0
- package/dist/config/fullstack-cli-pin.js +17 -0
- package/dist/config/sync-configs/design-stack.js +98 -0
- package/dist/config/sync-configs/index.js +62 -0
- package/dist/config/sync-configs/nestjs-react-fullstack.js +177 -0
- package/dist/config/sync.js +14 -0
- package/dist/services/app/init/index.js +12 -0
- package/dist/services/app/init/install.js +123 -0
- package/dist/services/app/init/template.js +108 -0
- package/dist/services/deploy/modern/atoms/build.js +59 -0
- package/dist/services/deploy/modern/atoms/context.js +27 -0
- package/dist/services/deploy/modern/atoms/index.js +17 -0
- package/dist/services/deploy/modern/atoms/local-release.js +27 -0
- package/dist/services/deploy/modern/atoms/pre-release.js +13 -0
- package/dist/services/deploy/modern/atoms/save-plugin-instances.js +72 -0
- package/dist/services/deploy/modern/atoms/upload.js +246 -0
- package/dist/services/deploy/modern/check.js +53 -0
- package/dist/services/deploy/modern/constants.js +13 -0
- package/dist/services/deploy/modern/index.js +16 -0
- package/dist/services/deploy/modern/pipelines/index.js +5 -0
- package/dist/services/deploy/modern/pipelines/local.js +75 -0
- package/dist/services/deploy/modern/protocol.js +122 -0
- package/dist/services/deploy/modern/run-types.js +4 -0
- package/dist/services/deploy/modern/run.js +13 -0
- package/dist/services/deploy/modern/template-key-map.js +22 -0
- package/dist/services/skills/index.js +5 -0
- package/dist/services/skills/status.js +37 -0
- package/dist/utils/coding-steering.js +169 -0
- package/dist/utils/file-ops.js +45 -0
- package/dist/utils/git.js +22 -0
- package/dist/utils/githooks.js +55 -0
- package/dist/utils/http.js +21 -11
- package/dist/utils/merge-json.js +63 -0
- package/dist/utils/npm-pack.js +55 -0
- package/dist/utils/platform-sync.js +160 -0
- package/dist/utils/spark-meta.js +42 -0
- package/dist/utils/sync-rule.js +295 -0
- package/package.json +5 -3
- package/upgrade/templates/README.md +34 -0
- package/upgrade/templates/design-stack/templates/.githooks/pre-commit +4 -0
- package/upgrade/templates/design-stack/templates/scripts/dev-local.sh +53 -0
- package/upgrade/templates/design-stack/templates/scripts/dev.sh +25 -0
- package/upgrade/templates/design-stack/templates/scripts/hooks/run-precommit.js +37 -0
- package/upgrade/templates/nestjs-react-fullstack/templates/.githooks/pre-commit +4 -0
- package/upgrade/templates/nestjs-react-fullstack/templates/.gitignore.append +8 -0
- package/upgrade/templates/nestjs-react-fullstack/templates/.spark_project +16 -0
- package/upgrade/templates/nestjs-react-fullstack/templates/drizzle.config.ts +55 -0
- package/upgrade/templates/nestjs-react-fullstack/templates/helper/gen-openapi.ts +34 -0
- package/upgrade/templates/nestjs-react-fullstack/templates/nest-cli.json +25 -0
- package/upgrade/templates/nestjs-react-fullstack/templates/scripts/build.sh +207 -0
- package/upgrade/templates/nestjs-react-fullstack/templates/scripts/dev-local.sh +61 -0
- package/upgrade/templates/nestjs-react-fullstack/templates/scripts/dev.js +295 -0
- package/upgrade/templates/nestjs-react-fullstack/templates/scripts/dev.sh +25 -0
- package/upgrade/templates/nestjs-react-fullstack/templates/scripts/hooks/run-precommit.js +37 -0
- package/upgrade/templates/nestjs-react-fullstack/templates/scripts/lint.js +150 -0
- package/upgrade/templates/nestjs-react-fullstack/templates/scripts/prune-smart.js +330 -0
- package/upgrade/templates/nestjs-react-fullstack/templates/scripts/run.sh +8 -0
- package/upgrade/templates/nestjs-react-fullstack/templates/server/global.d.ts +19 -0
- package/upgrade/templates/nestjs-react-fullstack/templates/tsconfig.node.json +5 -0
|
@@ -14,6 +14,24 @@ const COMMON_TIME_HELP = `
|
|
|
14
14
|
1) 不带时区的形式与 pretty 输出闭环(同机器复制粘贴稳定);跨机器请带显式时区。
|
|
15
15
|
2) 必须用 T 分隔日期与时间,禁止空格——shell 会把不带引号的 'YYYY-MM-DD HH:mm:ss' 拆成两个参数。
|
|
16
16
|
`;
|
|
17
|
+
function normalizeRepeatedOption(value) {
|
|
18
|
+
if (Array.isArray(value)) {
|
|
19
|
+
const items = value.filter((item) => typeof item === 'string' && item.length > 0);
|
|
20
|
+
return items.length === 1 ? items[0] : items;
|
|
21
|
+
}
|
|
22
|
+
return value;
|
|
23
|
+
}
|
|
24
|
+
function normalizeRepeatedArray(value) {
|
|
25
|
+
if (Array.isArray(value)) {
|
|
26
|
+
return value.filter((item) => typeof item === 'string' && item.length > 0);
|
|
27
|
+
}
|
|
28
|
+
return typeof value === 'string' && value ? [value] : [];
|
|
29
|
+
}
|
|
30
|
+
function compactRepeatedOption(values) {
|
|
31
|
+
if (values.length === 0)
|
|
32
|
+
return undefined;
|
|
33
|
+
return values.length === 1 ? values[0] : values;
|
|
34
|
+
}
|
|
17
35
|
function registerObservabilityCommands(program) {
|
|
18
36
|
const obCmd = program
|
|
19
37
|
.command('observability')
|
|
@@ -31,6 +49,7 @@ function registerObservabilityCommands(program) {
|
|
|
31
49
|
`);
|
|
32
50
|
registerLog(obCmd);
|
|
33
51
|
registerTrace(obCmd);
|
|
52
|
+
registerSourceStack(obCmd);
|
|
34
53
|
registerMetric(obCmd);
|
|
35
54
|
registerAnalytics(obCmd);
|
|
36
55
|
}
|
|
@@ -45,8 +64,8 @@ function registerLog(parent) {
|
|
|
45
64
|
.argParser((0, shared_1.caseInsensitiveChoice)(['DEBUG', 'INFO', 'WARN', 'ERROR'])))
|
|
46
65
|
.option('--since <time>', '开始时间')
|
|
47
66
|
.option('--until <time>', '截止时间')
|
|
48
|
-
.
|
|
49
|
-
.
|
|
67
|
+
.addOption(new commander_1.Option('--log-id <id>', '按请求 logid 过滤(可重复传入)').argParser(shared_1.collectRepeatedOption))
|
|
68
|
+
.addOption(new commander_1.Option('--trace-id <id>', '按 trace ID 过滤(可重复传入)').argParser(shared_1.collectRepeatedOption))
|
|
50
69
|
.option('--grep <pattern>', '按关键字模糊搜索 body')
|
|
51
70
|
.option('--module <name>', '按模块名过滤')
|
|
52
71
|
.option('--user-id <user-id>', '按触发用户 ID 过滤')
|
|
@@ -63,7 +82,9 @@ JSON 输出
|
|
|
63
82
|
示例
|
|
64
83
|
$ miaoda observability log --since 1h --level error --json
|
|
65
84
|
$ miaoda observability log --log-id log_abc123 --json
|
|
85
|
+
$ miaoda observability log --log-id log_1 --log-id log_2 --json
|
|
66
86
|
$ miaoda observability log --trace-id 140ebb5ac9b... --json
|
|
87
|
+
$ miaoda observability log --trace-id trace_1 --trace-id trace_2 --json
|
|
67
88
|
$ miaoda observability log --api /api/orders --min-duration 200 --json
|
|
68
89
|
`);
|
|
69
90
|
cmd.action((0, shared_1.withHelp)(cmd, async (rawOpts) => {
|
|
@@ -74,8 +95,8 @@ JSON 输出
|
|
|
74
95
|
level: rawOpts.level,
|
|
75
96
|
since: rawOpts.since,
|
|
76
97
|
until: rawOpts.until,
|
|
77
|
-
logId: rawOpts.logId,
|
|
78
|
-
traceId: rawOpts.traceId,
|
|
98
|
+
logId: normalizeRepeatedOption(rawOpts.logId),
|
|
99
|
+
traceId: normalizeRepeatedOption(rawOpts.traceId),
|
|
79
100
|
grep: rawOpts.grep,
|
|
80
101
|
module: rawOpts.module,
|
|
81
102
|
userId: rawOpts.userId,
|
|
@@ -100,7 +121,7 @@ function registerTrace(parent) {
|
|
|
100
121
|
.addOption((0, shared_1.appIdOption)().hideHelp())
|
|
101
122
|
.option('--since <time>', '开始时间')
|
|
102
123
|
.option('--until <time>', '截止时间')
|
|
103
|
-
.
|
|
124
|
+
.addOption(new commander_1.Option('--trace-id <id>', '按 trace ID 过滤(可重复传入)').argParser(shared_1.collectRepeatedOption))
|
|
104
125
|
.option('--root-span <span-name>', '按入口节点关键词过滤')
|
|
105
126
|
.option('--user-id <user-id>', '按触发用户 ID 过滤')
|
|
106
127
|
.option('--limit <n>', '返回条数上限(1~100)', parseLimit, 50)
|
|
@@ -111,6 +132,7 @@ JSON 输出
|
|
|
111
132
|
|
|
112
133
|
示例
|
|
113
134
|
$ miaoda observability trace list --since 1h --json
|
|
135
|
+
$ miaoda observability trace list --trace-id trace_1 --trace-id trace_2 --json
|
|
114
136
|
$ miaoda observability trace list --root-span api-gateway --limit 20 --json
|
|
115
137
|
`);
|
|
116
138
|
listCmd.action((0, shared_1.withHelp)(listCmd, async (rawOpts) => {
|
|
@@ -120,7 +142,7 @@ JSON 输出
|
|
|
120
142
|
appId: (0, shared_1.resolveAppId)({ appId: rawOpts.appId }),
|
|
121
143
|
since: rawOpts.since,
|
|
122
144
|
until: rawOpts.until,
|
|
123
|
-
traceId: rawOpts.traceId,
|
|
145
|
+
traceId: normalizeRepeatedOption(rawOpts.traceId),
|
|
124
146
|
rootSpan: rawOpts.rootSpan,
|
|
125
147
|
userId: rawOpts.userId,
|
|
126
148
|
limit: rawOpts.limit,
|
|
@@ -154,6 +176,40 @@ JSON 输出
|
|
|
154
176
|
});
|
|
155
177
|
}));
|
|
156
178
|
}
|
|
179
|
+
// ── source-stack ──
|
|
180
|
+
function registerSourceStack(parent) {
|
|
181
|
+
const cmd = parent
|
|
182
|
+
.command('source-stack')
|
|
183
|
+
.description('反解前端错误堆栈到源码位置')
|
|
184
|
+
.argument('[log-ids...]', '前端错误请求 logid,可传多个')
|
|
185
|
+
.addOption((0, shared_1.appIdOption)().hideHelp())
|
|
186
|
+
.addOption(new commander_1.Option('--log-id <id>', '前端错误请求 logid(可重复传入)').argParser(shared_1.collectRepeatedOption))
|
|
187
|
+
.addOption(new commander_1.Option('--trace-id <id>', '包含前端错误的 trace ID(可重复传入)').argParser(shared_1.collectRepeatedOption))
|
|
188
|
+
.option('--since <time>', '开始时间')
|
|
189
|
+
.option('--until <time>', '截止时间')
|
|
190
|
+
.option('--limit <n>', '每类查询返回条数上限(1~100)', parseLimit, 50)
|
|
191
|
+
.addHelpText('after', `${COMMON_TIME_HELP}
|
|
192
|
+
JSON 输出
|
|
193
|
+
{"data": [{"log_id": "...", "trace_id": "...", "status": "resolved", "error_message_stack": "Error: boom\\n at src/App.tsx:42:7"}], "next_cursor": null, "has_more": false}
|
|
194
|
+
|
|
195
|
+
示例
|
|
196
|
+
$ miaoda observability source-stack --log-id log_1 --log-id log_2 --json
|
|
197
|
+
$ miaoda observability source-stack --trace-id trace_1 --trace-id trace_2 --json
|
|
198
|
+
$ miaoda observability source-stack log_abc123 --json
|
|
199
|
+
`);
|
|
200
|
+
cmd.action((0, shared_1.withHelp)(cmd, async (logIds, rawOpts) => {
|
|
201
|
+
(0, shared_1.validateTimeOptions)(rawOpts, 'since', 'until');
|
|
202
|
+
(0, shared_1.rejectCliOverride)(cmd, 'appId');
|
|
203
|
+
await (0, index_1.handleObservabilitySourceStack)({
|
|
204
|
+
appId: (0, shared_1.resolveAppId)({ appId: rawOpts.appId }),
|
|
205
|
+
logId: compactRepeatedOption([...logIds, ...normalizeRepeatedArray(rawOpts.logId)]),
|
|
206
|
+
traceId: normalizeRepeatedOption(rawOpts.traceId),
|
|
207
|
+
since: rawOpts.since,
|
|
208
|
+
until: rawOpts.until,
|
|
209
|
+
limit: rawOpts.limit,
|
|
210
|
+
});
|
|
211
|
+
}));
|
|
212
|
+
}
|
|
157
213
|
// ── metric ──
|
|
158
214
|
function registerMetric(parent) {
|
|
159
215
|
const cmd = parent
|
|
@@ -7,6 +7,7 @@ exports.softRequiredOption = softRequiredOption;
|
|
|
7
7
|
exports.resolveAppId = resolveAppId;
|
|
8
8
|
exports.withHelp = withHelp;
|
|
9
9
|
exports.caseInsensitiveChoice = caseInsensitiveChoice;
|
|
10
|
+
exports.collectRepeatedOption = collectRepeatedOption;
|
|
10
11
|
exports.validateTimeOptions = validateTimeOptions;
|
|
11
12
|
exports.rejectCliOverride = rejectCliOverride;
|
|
12
13
|
const commander_1 = require("commander");
|
|
@@ -86,6 +87,10 @@ function caseInsensitiveChoice(canonical) {
|
|
|
86
87
|
return hit;
|
|
87
88
|
};
|
|
88
89
|
}
|
|
90
|
+
/** Commander repeatable option parser:重复传入时收集为数组。 */
|
|
91
|
+
function collectRepeatedOption(value, previous = []) {
|
|
92
|
+
return [...previous, value];
|
|
93
|
+
}
|
|
89
94
|
/**
|
|
90
95
|
* --since / --until 等时间参数的 action 阶段校验。
|
|
91
96
|
*
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerSkillsCommands = registerSkillsCommands;
|
|
4
|
+
const shared_1 = require("../../../cli/commands/shared");
|
|
5
|
+
const index_1 = require("../../../cli/handlers/skills/index");
|
|
6
|
+
/**
|
|
7
|
+
* miaoda skills:本地 agent skills 维护。
|
|
8
|
+
*
|
|
9
|
+
* 当前仅 steering 一类子集(coding-steering 包内的 _common/skills + <stack>/skills + tech.md);
|
|
10
|
+
* 后续如有更多 skill 类型再加 --type。`app init` 会一次性同步装上,独立 `skills sync` 用于
|
|
11
|
+
* 后续单独升级 / pin 版本,不必走完整 init。
|
|
12
|
+
*/
|
|
13
|
+
function registerSkillsCommands(program) {
|
|
14
|
+
const skillsCmd = program.command('skills').description('本地 agent skills(含 steering)维护');
|
|
15
|
+
skillsCmd.action(() => {
|
|
16
|
+
skillsCmd.outputHelp();
|
|
17
|
+
});
|
|
18
|
+
registerSkillsSync(skillsCmd);
|
|
19
|
+
registerSkillsStatus(skillsCmd);
|
|
20
|
+
}
|
|
21
|
+
function registerSkillsSync(parent) {
|
|
22
|
+
const cmd = parent
|
|
23
|
+
.command('sync')
|
|
24
|
+
.description('同步 coding-steering(latest 或指定版本)到 user app')
|
|
25
|
+
.argument('[version]', 'coding-steering 包版本或 dist-tag,缺省 latest')
|
|
26
|
+
.option('--dir <path>', '项目目录,默认当前目录', '.')
|
|
27
|
+
.option('--local', '走本地 dev / agent 输出形态:拷到 .agents/skills 平铺 + 创建 .claude/skills 软链。' +
|
|
28
|
+
'不传时退回老形态:拷到 .agent/skills/steering/<stack>/skills/(跟沙箱端 update-skills.sh 对齐)', false)
|
|
29
|
+
.addHelpText('after', `
|
|
30
|
+
前置要求
|
|
31
|
+
当前目录(或 --dir)已走过 'miaoda app init'(.spark/meta.json 含 stack)
|
|
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
|
+
|
|
44
|
+
JSON 输出
|
|
45
|
+
{"data": {"stack": "...", "version": "...", "syncedSkills": [...], "techSynced": true|false,
|
|
46
|
+
"claudeSkillsLink": "created|updated|noop|conflict" // 仅 --local 时}}
|
|
47
|
+
|
|
48
|
+
示例
|
|
49
|
+
$ miaoda skills sync
|
|
50
|
+
$ miaoda skills sync --local # 本地 dev / agent 用
|
|
51
|
+
$ miaoda skills sync 0.2.0
|
|
52
|
+
$ miaoda skills sync --dir ./my-app
|
|
53
|
+
`);
|
|
54
|
+
cmd.action((0, shared_1.withHelp)(cmd, async (version, rawOpts) => {
|
|
55
|
+
await (0, index_1.handleSkillsSync)({
|
|
56
|
+
dir: rawOpts.dir,
|
|
57
|
+
version,
|
|
58
|
+
local: rawOpts.local,
|
|
59
|
+
});
|
|
60
|
+
}));
|
|
61
|
+
}
|
|
62
|
+
function registerSkillsStatus(parent) {
|
|
63
|
+
const cmd = parent
|
|
64
|
+
.command('status')
|
|
65
|
+
.description('查看本地 .agent/steering/ 的当前状态(不联网)')
|
|
66
|
+
.option('--dir <path>', '项目目录,默认当前目录', '.')
|
|
67
|
+
.addHelpText('after', `
|
|
68
|
+
JSON 输出
|
|
69
|
+
{"data": {"present": true|false, "skills": [...], "techSynced": true|false}}
|
|
70
|
+
|
|
71
|
+
示例
|
|
72
|
+
$ miaoda skills status
|
|
73
|
+
`);
|
|
74
|
+
cmd.action((0, shared_1.withHelp)(cmd, async (rawOpts) => {
|
|
75
|
+
await (0, index_1.handleSkillsStatus)({
|
|
76
|
+
dir: rawOpts.dir,
|
|
77
|
+
});
|
|
78
|
+
}));
|
|
79
|
+
}
|
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.handleAppUpdate = exports.handleAppGet = void 0;
|
|
3
|
+
exports.SUPPORTED_STACKS = exports.handleAppUpgrade = exports.handleAppSync = exports.handleAppInit = exports.handleAppUpdate = exports.handleAppGet = void 0;
|
|
4
4
|
var get_1 = require("./get");
|
|
5
5
|
Object.defineProperty(exports, "handleAppGet", { enumerable: true, get: function () { return get_1.handleAppGet; } });
|
|
6
6
|
var update_1 = require("./update");
|
|
7
7
|
Object.defineProperty(exports, "handleAppUpdate", { enumerable: true, get: function () { return update_1.handleAppUpdate; } });
|
|
8
|
+
var init_1 = require("./init");
|
|
9
|
+
Object.defineProperty(exports, "handleAppInit", { enumerable: true, get: function () { return init_1.handleAppInit; } });
|
|
10
|
+
var sync_1 = require("./sync");
|
|
11
|
+
Object.defineProperty(exports, "handleAppSync", { enumerable: true, get: function () { return sync_1.handleAppSync; } });
|
|
12
|
+
Object.defineProperty(exports, "handleAppUpgrade", { enumerable: true, get: function () { return sync_1.handleAppUpgrade; } });
|
|
13
|
+
// commands 层渲染 help 时需要这份枚举;从 handler barrel 转发,避免 commands → services 越界
|
|
14
|
+
var index_1 = require("../../../services/app/init/index");
|
|
15
|
+
Object.defineProperty(exports, "SUPPORTED_STACKS", { enumerable: true, get: function () { return index_1.SUPPORTED_STACKS; } });
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.handleAppInit = handleAppInit;
|
|
7
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const index_1 = require("../../../services/app/init/index");
|
|
10
|
+
const coding_steering_1 = require("../../../utils/coding-steering");
|
|
11
|
+
const logger_1 = require("../../../utils/logger");
|
|
12
|
+
const githooks_1 = require("../../../utils/githooks");
|
|
13
|
+
const sync_1 = require("../../../cli/handlers/app/sync");
|
|
14
|
+
const error_1 = require("../../../utils/error");
|
|
15
|
+
const output_1 = require("../../../utils/output");
|
|
16
|
+
/**
|
|
17
|
+
* miaoda app init
|
|
18
|
+
*
|
|
19
|
+
* 一站式本地脚手架:render template → upgrade/templates sync → skills sync → install deps,把
|
|
20
|
+
* {stack, version, archType, app_id?} 写入 .spark/meta.json。--app-id(或 MIAODA_APP_ID)提供时
|
|
21
|
+
* 持久化 app_id;运行端命令仍优先读 env,未设置时回退到 meta.json。
|
|
22
|
+
*
|
|
23
|
+
* 幂等:.spark/meta.json 存在即表示已完整成功一次,直接退出,不重跑任何子步骤。
|
|
24
|
+
* 半渲染状态(package.json 在但 meta.json 不在)会重新跑完整流程。
|
|
25
|
+
*/
|
|
26
|
+
async function handleAppInit(opts) {
|
|
27
|
+
await Promise.resolve();
|
|
28
|
+
const targetDir = opts.targetDir ?? process.cwd();
|
|
29
|
+
const metaPath = node_path_1.default.join(targetDir, '.spark', 'meta.json');
|
|
30
|
+
if (node_fs_1.default.existsSync(metaPath)) {
|
|
31
|
+
if (!(0, output_1.isJsonMode)()) {
|
|
32
|
+
process.stdout.write(`Already initialized: ${metaPath}\n`);
|
|
33
|
+
}
|
|
34
|
+
(0, output_1.emit)({
|
|
35
|
+
data: {
|
|
36
|
+
initialized: false,
|
|
37
|
+
reason: 'already_initialized',
|
|
38
|
+
targetDir,
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const stack = opts.template;
|
|
44
|
+
if (!stack) {
|
|
45
|
+
throw new error_1.AppError('ARGS_INVALID', '缺少 --template <stack>', {
|
|
46
|
+
next_actions: [`可用 stack:${index_1.SUPPORTED_STACKS.join(', ')}`],
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
if (!index_1.SUPPORTED_STACKS.includes(stack)) {
|
|
50
|
+
throw new error_1.AppError('ARGS_INVALID', `不支持的 template: ${stack}`, {
|
|
51
|
+
next_actions: [`可用 stack:${index_1.SUPPORTED_STACKS.join(', ')}`],
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
const version = opts.conf?.version;
|
|
55
|
+
const projectName = node_path_1.default.basename(targetDir);
|
|
56
|
+
const tplResult = (0, index_1.renderTemplate)({ stack, version, targetDir, projectName });
|
|
57
|
+
// sync 紧跟 template 渲染之后,赶在 install 之前:
|
|
58
|
+
// 这样 directory / merge-json / add-script 等 rule 都已落地,install 出来的 lockfile
|
|
59
|
+
// 与最终态对齐;patches 还能覆盖 template 提供的同名文件。
|
|
60
|
+
const syncRunResult = (0, sync_1.runStackSync)(stack, targetDir, 'init');
|
|
61
|
+
const syncSummary = (0, sync_1.summarizeSyncResults)(syncRunResult);
|
|
62
|
+
// template 渲染下来的 @lark-apaas/* 版本可能落后 PINNED 表,赶在 install 之前钉到表版本,
|
|
63
|
+
// 这样一次 npm install 就直接装最终版本,不需要 install 完再补一遍。
|
|
64
|
+
const upgradedPackages = (0, sync_1.upgradePlatformDeps)(targetDir, 'init');
|
|
65
|
+
// skills 同步软失败:拉不到 coding-steering 包不该阻断 writeSparkMeta /
|
|
66
|
+
// activateGitHooks(之前会让 .spark/meta.json 没写,下次 init 半渲染状态又得重跑全套)。
|
|
67
|
+
let steeringResult;
|
|
68
|
+
let steeringError;
|
|
69
|
+
try {
|
|
70
|
+
steeringResult = (0, coding_steering_1.syncCodingSteering)({
|
|
71
|
+
stack,
|
|
72
|
+
targetDir,
|
|
73
|
+
version: opts.conf?.steeringVersion,
|
|
74
|
+
logPrefix: 'init',
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
steeringError = err instanceof Error ? err.message : String(err);
|
|
79
|
+
(0, logger_1.log)('init', `⚠ skills sync failed (continuing init): ${steeringError}`);
|
|
80
|
+
steeringResult = { version: 'unknown', syncedSkills: [], techSynced: false };
|
|
81
|
+
}
|
|
82
|
+
const installResult = (0, index_1.installDependencies)({
|
|
83
|
+
targetDir,
|
|
84
|
+
skip: opts.skipInstall,
|
|
85
|
+
quietStdout: (0, output_1.isJsonMode)(),
|
|
86
|
+
});
|
|
87
|
+
// template 自带 .githooks/pre-commit;如果用户项目已 git init,顺便设上 core.hooksPath。
|
|
88
|
+
const hookActivation = (0, githooks_1.activateGitHooks)(targetDir);
|
|
89
|
+
(0, index_1.writeSparkMeta)(targetDir, {
|
|
90
|
+
stack,
|
|
91
|
+
version: tplResult.version,
|
|
92
|
+
archType: tplResult.archType,
|
|
93
|
+
app_id: opts.appId,
|
|
94
|
+
steeringVersion: steeringResult.version,
|
|
95
|
+
});
|
|
96
|
+
const syncedSummary = syncRunResult.stackFound
|
|
97
|
+
? syncRunResult.rulesApplied.length > 0
|
|
98
|
+
? `${syncRunResult.rulesApplied.length.toString()} rule(s)`
|
|
99
|
+
: 'legacy'
|
|
100
|
+
: 'skipped';
|
|
101
|
+
if (!(0, output_1.isJsonMode)()) {
|
|
102
|
+
process.stdout.write(`✓ Initialized ${stack} (template ${tplResult.version}, steering ${steeringResult.version}, sync ${syncedSummary}, install ${installResult.source}) in ${targetDir}\n`);
|
|
103
|
+
}
|
|
104
|
+
(0, output_1.emit)({
|
|
105
|
+
data: {
|
|
106
|
+
initialized: true,
|
|
107
|
+
template: stack,
|
|
108
|
+
templatePackage: tplResult.packageName,
|
|
109
|
+
templateVersion: tplResult.version,
|
|
110
|
+
steeringVersion: steeringResult.version,
|
|
111
|
+
archType: tplResult.archType,
|
|
112
|
+
appId: opts.appId,
|
|
113
|
+
syncedSkills: steeringResult.syncedSkills,
|
|
114
|
+
techSynced: steeringResult.techSynced,
|
|
115
|
+
steeringError,
|
|
116
|
+
// sync 流程的产出:rule-driven 时 appliedRules + 一系列汇总字段;fallback 到旧 platform-sync
|
|
117
|
+
// 时只填 platformSyncedFiles / platformMergedJsonFiles;stack 不识别时全空且 platformStackFound=false。
|
|
118
|
+
platformStackFound: syncRunResult.stackFound,
|
|
119
|
+
appliedRules: syncSummary.appliedRules,
|
|
120
|
+
platformSyncedFiles: syncSummary.syncedFiles,
|
|
121
|
+
platformMergedJsonFiles: syncSummary.mergedJsonFiles,
|
|
122
|
+
patchedScripts: syncSummary.patchedScripts,
|
|
123
|
+
upgradedPackages,
|
|
124
|
+
gitHooks: hookActivation.action,
|
|
125
|
+
installed: installResult.installed,
|
|
126
|
+
installSource: installResult.source,
|
|
127
|
+
installHash: installResult.hash,
|
|
128
|
+
cacheZip: installResult.cacheZip,
|
|
129
|
+
installError: installResult.error,
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.handleAppUpgrade = void 0;
|
|
7
|
+
exports.handleAppSync = handleAppSync;
|
|
8
|
+
exports.runStackSync = runStackSync;
|
|
9
|
+
exports.summarizeSyncResults = summarizeSyncResults;
|
|
10
|
+
exports.upgradePlatformDeps = upgradePlatformDeps;
|
|
11
|
+
const node_child_process_1 = require("node:child_process");
|
|
12
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
13
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
14
|
+
const sync_configs_1 = require("../../../config/sync-configs");
|
|
15
|
+
const sync_rule_1 = require("../../../utils/sync-rule");
|
|
16
|
+
const platform_sync_1 = require("../../../utils/platform-sync");
|
|
17
|
+
const githooks_1 = require("../../../utils/githooks");
|
|
18
|
+
const spark_meta_1 = require("../../../utils/spark-meta");
|
|
19
|
+
const error_1 = require("../../../utils/error");
|
|
20
|
+
const output_1 = require("../../../utils/output");
|
|
21
|
+
const logger_1 = require("../../../utils/logger");
|
|
22
|
+
/**
|
|
23
|
+
* 平台包钉死版本表 —— `miaoda app sync` 不查 npm dist-tags,直接按这张表把
|
|
24
|
+
* user app 已有的 @lark-apaas/* 依赖钉到对应版本。
|
|
25
|
+
*
|
|
26
|
+
* 为什么不跟 alpha dist-tag:alpha 通道被多个团队共享,外部 prerelease 时常打过去,
|
|
27
|
+
* 自动跟 alpha 会把回归版本(如 fullstack-vite-preset@1.0.24-alpha.5 退化没读 .env.local)
|
|
28
|
+
* 拉进 user app。维护这张白名单可控性更高,每次升基线时人工 review 一次再改这里。
|
|
29
|
+
*
|
|
30
|
+
* 表里没有的 @lark-apaas/* 包:sync 不动(既不升也不报错);user app 没装的包也不引入。
|
|
31
|
+
* 改这张表请同步把 user app 端到端 smoke 跑一次(init → sync → npm run dev)。
|
|
32
|
+
*/
|
|
33
|
+
const PINNED_PLATFORM_VERSIONS = {
|
|
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
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* miaoda app sync [--dir <path>]
|
|
44
|
+
*
|
|
45
|
+
* 一站式同步:把当前 stack 的 sync 规则全套 apply 到 user app,对齐沙箱里
|
|
46
|
+
* `npm run upgrade → npx fullstack-cli sync` 的行为,并补 miaoda-cli 本地开发独有规则。
|
|
47
|
+
*
|
|
48
|
+
* 执行流:
|
|
49
|
+
* 1. SyncRule[] 全量 apply —— 来自 src/config/sync-configs/<stack>.ts。每个 stack
|
|
50
|
+
* 自带模板资源在 upgrade/templates/<stack>/templates/。表里没有该 stack 时回退到
|
|
51
|
+
* 旧 platform-sync 兜底(兼容尚未迁移的 stack)。
|
|
52
|
+
* 2. PINNED 平台 deps 钉版本 —— user app 已装的 @lark-apaas/* 升到 PINNED 表。
|
|
53
|
+
* 3. activateGitHooks —— 设置 core.hooksPath(template 自带 .githooks/pre-commit)。
|
|
54
|
+
* 4. npm install --no-audit --no-fund --ignore-scripts —— 物化新版本,绕开
|
|
55
|
+
* action-plugin postinstall 在缺平台 env 时的 ENOENT。
|
|
56
|
+
*
|
|
57
|
+
* 需要 .spark/meta.json 已含 stack(走过 `miaoda app init`)。
|
|
58
|
+
* 不动 .agent/skills/(那是 `miaoda skills sync` 的事)。
|
|
59
|
+
*/
|
|
60
|
+
async function handleAppSync(opts) {
|
|
61
|
+
await Promise.resolve();
|
|
62
|
+
const targetDir = node_path_1.default.resolve(opts.dir ?? process.cwd());
|
|
63
|
+
const meta = (0, spark_meta_1.readSparkMeta)(targetDir);
|
|
64
|
+
if (meta.stack === undefined || meta.stack === '') {
|
|
65
|
+
throw new error_1.AppError('SYNC_META_INCOMPLETE', '.spark/meta.json missing stack — run `miaoda app init` first');
|
|
66
|
+
}
|
|
67
|
+
// 1. apply SyncRule[],stack 没注册时回退到旧 platform-sync 兜底;都不识别就报错
|
|
68
|
+
const syncResults = runStackSync(meta.stack, targetDir, 'sync');
|
|
69
|
+
if (!syncResults.stackFound) {
|
|
70
|
+
throw new error_1.AppError('SYNC_STACK_NOT_SUPPORTED', `stack '${meta.stack}' has no SyncConfig and no upgrade/templates/${meta.stack}/ — 该 stack 暂未纳入 sync 范围`, {
|
|
71
|
+
next_actions: [
|
|
72
|
+
`src/config/sync-configs/${meta.stack}.ts 加 SyncConfig 并在 STACK_REGISTRY 注册`,
|
|
73
|
+
],
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
// 2. @lark-apaas/* dep pin(按 PINNED_PLATFORM_VERSIONS 表,user app 已装才钉)
|
|
77
|
+
const upgradedPackages = upgradePlatformDeps(targetDir, 'sync');
|
|
78
|
+
// 3. activate git hooks(template 自带 .githooks/pre-commit,core.hooksPath 一次性设置)
|
|
79
|
+
const hookActivation = (0, githooks_1.activateGitHooks)(targetDir);
|
|
80
|
+
// 4. npm install —— 跟 init 一样软失败,install 挂了不该阻断 emit / sync 总结输出
|
|
81
|
+
(0, logger_1.log)('sync', 'Running npm install --ignore-scripts...');
|
|
82
|
+
let installError;
|
|
83
|
+
try {
|
|
84
|
+
(0, node_child_process_1.execFileSync)('npm', ['install', '--no-audit', '--no-fund', '--ignore-scripts'], {
|
|
85
|
+
cwd: targetDir,
|
|
86
|
+
stdio: (0, output_1.isJsonMode)() ? ['ignore', 'ignore', 'inherit'] : 'inherit',
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
installError = err instanceof Error ? err.message : String(err);
|
|
91
|
+
(0, logger_1.log)('sync', `⚠ npm install failed (continuing): ${installError}`);
|
|
92
|
+
}
|
|
93
|
+
(0, output_1.emit)({
|
|
94
|
+
data: {
|
|
95
|
+
stack: meta.stack,
|
|
96
|
+
...summarizeSyncResults(syncResults),
|
|
97
|
+
upgradedPackages,
|
|
98
|
+
gitHooks: hookActivation.action,
|
|
99
|
+
installError,
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
/** 老命令 `miaoda app upgrade` 的 handler 名,保留为 sync handler 的 alias。 */
|
|
104
|
+
exports.handleAppUpgrade = handleAppSync;
|
|
105
|
+
/**
|
|
106
|
+
* 给 stack 应用 sync rules(sync handler + init handler 共用)。
|
|
107
|
+
* stack 在 STACK_REGISTRY 注册时走新 SyncRule 机制,否则回落到旧 platform-sync。
|
|
108
|
+
*
|
|
109
|
+
* stack 完全不识别(既不在 STACK_REGISTRY 也无 upgrade/templates/<stack>/ 目录)时返回
|
|
110
|
+
* `stackFound: false` 而非抛错 —— 让调用方按场景决定:sync handler 抛 AppError,init handler
|
|
111
|
+
* 允许(fresh init 时 stack 还在加注册的过渡期)。
|
|
112
|
+
*/
|
|
113
|
+
function runStackSync(stack, targetDir, logPrefix) {
|
|
114
|
+
const config = (0, sync_configs_1.getSyncConfig)(stack);
|
|
115
|
+
if (config !== null) {
|
|
116
|
+
const sourceRoot = (0, sync_configs_1.getStackTemplatesRoot)(stack);
|
|
117
|
+
if (!node_fs_1.default.existsSync(sourceRoot)) {
|
|
118
|
+
throw new error_1.AppError('SYNC_TEMPLATES_MISSING', `upgrade/templates/${stack}/templates/ not found at ${sourceRoot} — cli 安装异常?`);
|
|
119
|
+
}
|
|
120
|
+
(0, logger_1.log)(logPrefix, `Applying ${config.sync.length.toString()} sync rule(s) for stack '${stack}'`);
|
|
121
|
+
const rulesApplied = (0, sync_rule_1.applySyncRules)(config.sync, { sourceRoot, targetDir, logPrefix });
|
|
122
|
+
return { stackFound: true, rulesApplied };
|
|
123
|
+
}
|
|
124
|
+
// fallback:表外 stack 仍用旧 platform-sync 机制(files/ overlay + patches/ deep merge)
|
|
125
|
+
(0, logger_1.log)(logPrefix, `Stack '${stack}' not in new sync registry, falling back to legacy platform-sync`);
|
|
126
|
+
const legacy = (0, platform_sync_1.syncPlatformControlled)({ stack, targetDir, logPrefix });
|
|
127
|
+
return {
|
|
128
|
+
stackFound: legacy.stackFound,
|
|
129
|
+
rulesApplied: [],
|
|
130
|
+
legacy: { syncedFiles: legacy.syncedFiles, mergedJsonFiles: legacy.mergedJsonFiles },
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/** 把 SyncRuleResult[] / legacy 输出汇总成 emit data 里的几组字段,便于诊断。 */
|
|
134
|
+
function summarizeSyncResults(result) {
|
|
135
|
+
if (result.legacy !== undefined) {
|
|
136
|
+
return {
|
|
137
|
+
appliedRules: [],
|
|
138
|
+
syncedFiles: result.legacy.syncedFiles,
|
|
139
|
+
mergedJsonFiles: result.legacy.mergedJsonFiles,
|
|
140
|
+
patchedScripts: [],
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
const appliedRules = result.rulesApplied.map((r) => ({
|
|
144
|
+
type: r.rule.type,
|
|
145
|
+
action: r.action,
|
|
146
|
+
path: r.path,
|
|
147
|
+
detail: r.detail,
|
|
148
|
+
}));
|
|
149
|
+
const syncedFiles = [];
|
|
150
|
+
for (const r of result.rulesApplied) {
|
|
151
|
+
if ((r.action === 'synced' || r.action === 'created') && r.path !== undefined) {
|
|
152
|
+
syncedFiles.push(r.path);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
const mergedJsonFiles = [];
|
|
156
|
+
for (const r of result.rulesApplied) {
|
|
157
|
+
if (r.rule.type !== 'merge-json')
|
|
158
|
+
continue;
|
|
159
|
+
if (r.action !== 'merged' && r.action !== 'created')
|
|
160
|
+
continue;
|
|
161
|
+
if (r.path === undefined)
|
|
162
|
+
continue;
|
|
163
|
+
mergedJsonFiles.push({
|
|
164
|
+
path: r.path,
|
|
165
|
+
keys: r.detail !== undefined ? r.detail.split(',').filter(Boolean) : [],
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
const patchedScripts = result.rulesApplied
|
|
169
|
+
.filter((r) => (r.rule.type === 'patch-script' || r.rule.type === 'add-script') &&
|
|
170
|
+
(r.action === 'patched' || r.action === 'created'))
|
|
171
|
+
.map((r) => r.rule.name);
|
|
172
|
+
return { appliedRules, syncedFiles, mergedJsonFiles, patchedScripts };
|
|
173
|
+
}
|
|
174
|
+
function readPackageJson(pkgJsonPath) {
|
|
175
|
+
if (!node_fs_1.default.existsSync(pkgJsonPath))
|
|
176
|
+
return null;
|
|
177
|
+
return JSON.parse(node_fs_1.default.readFileSync(pkgJsonPath, 'utf-8'));
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* 把 user app package.json 里已装的 @lark-apaas/* 包钉到 PINNED_PLATFORM_VERSIONS 表版本。
|
|
181
|
+
* 由 `miaoda app sync` 和 `miaoda app init`(template 渲染后、install 之前)共用。
|
|
182
|
+
*
|
|
183
|
+
* - user app 已装的 PINNED 包 → 钉到表版本
|
|
184
|
+
* - user app 未装的 PINNED 包 → 不引入(sync 的职责是对齐,不是塞依赖)
|
|
185
|
+
* - 装着但不在 PINNED 表的 @lark-apaas/* 包 → 完全不动
|
|
186
|
+
*
|
|
187
|
+
* @param logPrefix 用于 `[<prefix>] deps.xxx: a → b` 日志前缀;sync 流程传 'sync',init 流程传 'init'。
|
|
188
|
+
*/
|
|
189
|
+
function upgradePlatformDeps(targetDir, logPrefix = 'sync') {
|
|
190
|
+
const pkgJsonPath = node_path_1.default.join(targetDir, 'package.json');
|
|
191
|
+
const pkg = readPackageJson(pkgJsonPath);
|
|
192
|
+
if (!pkg)
|
|
193
|
+
return [];
|
|
194
|
+
const updated = [];
|
|
195
|
+
for (const section of ['dependencies', 'devDependencies']) {
|
|
196
|
+
const deps = pkg[section];
|
|
197
|
+
if (!deps || typeof deps !== 'object')
|
|
198
|
+
continue;
|
|
199
|
+
for (const name of Object.keys(deps)) {
|
|
200
|
+
if (!Object.prototype.hasOwnProperty.call(PINNED_PLATFORM_VERSIONS, name))
|
|
201
|
+
continue;
|
|
202
|
+
const target = PINNED_PLATFORM_VERSIONS[name];
|
|
203
|
+
const from = deps[name];
|
|
204
|
+
if (from === target)
|
|
205
|
+
continue;
|
|
206
|
+
deps[name] = target;
|
|
207
|
+
updated.push({ name, from, to: target, section });
|
|
208
|
+
(0, logger_1.log)(logPrefix, ` ${section}.${name}: ${from} → ${target}`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (updated.length > 0) {
|
|
212
|
+
node_fs_1.default.writeFileSync(pkgJsonPath, JSON.stringify(pkg, null, 2) + '\n', 'utf-8');
|
|
213
|
+
}
|
|
214
|
+
return updated;
|
|
215
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.handleDeployModern = handleDeployModern;
|
|
7
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
8
|
+
const output_1 = require("../../../utils/output");
|
|
9
|
+
const index_1 = require("../../../services/deploy/modern/index");
|
|
10
|
+
/**
|
|
11
|
+
* miaoda deploy(modern scene 专用,CLI 表面对齐 openclaw-cli)
|
|
12
|
+
*
|
|
13
|
+
* 进程信息走 stderr(log_id / step),最终结果通过 emit 输出 envelope 到 stdout。
|
|
14
|
+
*/
|
|
15
|
+
async function handleDeployModern(opts) {
|
|
16
|
+
const projectDir = node_path_1.default.resolve(opts.dir);
|
|
17
|
+
const result = await (0, index_1.runModernDeploy)({
|
|
18
|
+
projectDir,
|
|
19
|
+
appId: opts.appId,
|
|
20
|
+
skipBuild: opts.skipBuild ?? false,
|
|
21
|
+
});
|
|
22
|
+
(0, output_1.emit)({
|
|
23
|
+
data: {
|
|
24
|
+
appId: result.appId,
|
|
25
|
+
version: result.version,
|
|
26
|
+
url: result.url,
|
|
27
|
+
releaseID: result.releaseID,
|
|
28
|
+
preReleaseID: result.preReleaseID,
|
|
29
|
+
},
|
|
30
|
+
next_cursor: null,
|
|
31
|
+
has_more: false,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ceilMsToBucket = exports.floorMsToBucket = exports.msToSec = exports.msToNs = exports.parseToSec = exports.parseToNs = exports.parseToMs = exports.parseTimeToMs = void 0;
|
|
4
4
|
exports.eqFilter = eqFilter;
|
|
5
|
+
exports.inFilter = inFilter;
|
|
5
6
|
exports.rangeFilter = rangeFilter;
|
|
6
7
|
exports.fuzzyFilter = fuzzyFilter;
|
|
7
8
|
exports.buildFieldFilters = buildFieldFilters;
|
|
@@ -27,6 +28,9 @@ function eqFilter(value, type = 'str') {
|
|
|
27
28
|
const v = type !== 'str' ? Number(value) : value;
|
|
28
29
|
return { [type]: { eq: v } };
|
|
29
30
|
}
|
|
31
|
+
function inFilter(strs) {
|
|
32
|
+
return { str: { in: strs } };
|
|
33
|
+
}
|
|
30
34
|
/** i64 数值范围过滤 → { i64: { gte, lte } };输入接受 string(CLI flag)或 number */
|
|
31
35
|
function rangeFilter(opts) {
|
|
32
36
|
const i64 = {};
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.handleObservabilityAnalytics = exports.handleObservabilityMetric = exports.handleObservabilityTraceGet = exports.handleObservabilityTraceList = exports.handleObservabilityLog = void 0;
|
|
3
|
+
exports.handleObservabilityAnalytics = exports.handleObservabilityMetric = exports.handleObservabilitySourceStack = exports.handleObservabilityTraceGet = exports.handleObservabilityTraceList = exports.handleObservabilityLog = void 0;
|
|
4
4
|
var log_1 = require("./log");
|
|
5
5
|
Object.defineProperty(exports, "handleObservabilityLog", { enumerable: true, get: function () { return log_1.handleObservabilityLog; } });
|
|
6
6
|
var trace_1 = require("./trace");
|
|
7
7
|
Object.defineProperty(exports, "handleObservabilityTraceList", { enumerable: true, get: function () { return trace_1.handleObservabilityTraceList; } });
|
|
8
8
|
Object.defineProperty(exports, "handleObservabilityTraceGet", { enumerable: true, get: function () { return trace_1.handleObservabilityTraceGet; } });
|
|
9
|
+
var source_stack_1 = require("./source-stack");
|
|
10
|
+
Object.defineProperty(exports, "handleObservabilitySourceStack", { enumerable: true, get: function () { return source_stack_1.handleObservabilitySourceStack; } });
|
|
9
11
|
var metric_1 = require("./metric");
|
|
10
12
|
Object.defineProperty(exports, "handleObservabilityMetric", { enumerable: true, get: function () { return metric_1.handleObservabilityMetric; } });
|
|
11
13
|
var analytics_1 = require("./analytics");
|