@lark-apaas/miaoda-cli 0.1.31 → 0.1.33
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
CHANGED
|
@@ -55,7 +55,7 @@ miaoda file ls --output json
|
|
|
55
55
|
|
|
56
56
|
`miaoda registry` 提供 shadcn 式的「组件 registry」:把 SDK 文件**拷进**当前项目(copy-in),而非作为依赖安装。registry 是独立 npm 包,按运行时分发(design-html / html → buildless runtime → `@lark-apaas/coding-registry-buildless`)。
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
前置:当前工作目录已走过 `miaoda app init`,且 `.spark/meta.json` 的 `stack` 有对应 registry 包(当前支持 `design-html` / `html`);其余 stack 执行时报 `REGISTRY_STACK_UNSUPPORTED` 并提示支持列表。meta 一律从 cwd 读取,不随 `--dir` 走。
|
|
59
59
|
|
|
60
60
|
```bash
|
|
61
61
|
# 列出可用 SDK 条目(输出各文件 USAGE 注释块原文,便于 Agent 直接读用法)
|
|
@@ -76,7 +76,7 @@ miaoda registry add deck-slide --overwrite # 目标已存在时覆盖(
|
|
|
76
76
|
- **拍平落地**:所有文件**拍平**到项目根(`scripts/deck-slide.js` → 项目 `deck-slide.js`,不保留子目录);闭包内同名 basename 撞车时后者覆盖前者。
|
|
77
77
|
- **skip-by-disk**:项目已有同名(拍平后的 basename)文件默认跳过,`--overwrite` 才覆盖;不写任何安装记账文件,项目文件树即状态。
|
|
78
78
|
- **add 回执带 usage**:`add` 结果的 `entries` 只列**你请求的条目**(不含被 `Depends` 传递拉进来的依赖——依赖照常落地在 `added`/`skipped`,但那是"管道"),逐条给出 `usage`(USAGE 块原文)与 `dependsOn`,Agent `add` 完即可直接读用法,无需再 `registry list`。请求的条目即使已存在被跳过也回带 usage(`status` 标 `added`/`skipped`,据此判断磁盘上是 registry 版还是你改过的旧版)。`--json` 结构为 `{registryVersion, added, skipped, dryRun, entries}`;pretty(默认)输出 `registry@<ver>` + `added:`/`skipped:` 逗号列表 + 各请求条目的 USAGE 块,稳定 label、无 JSON 数组、无截断,对 Agent 与人同样可读。
|
|
79
|
-
- `--version <ver>` 指定 registry 包版本或 dist-tag(缺省 `latest
|
|
79
|
+
- `--version <ver>` 指定 registry 包版本或 dist-tag(缺省 `latest`);`add` 的 `--dir <path>` 指定 copy-in 落地目录(缺省当前目录),不影响 `.spark/meta.json` 读取。
|
|
80
80
|
|
|
81
81
|
## 全局参数
|
|
82
82
|
|
|
@@ -33,8 +33,9 @@ function registerRegistryCommands(program) {
|
|
|
33
33
|
- add 落地:拍平到项目根(包根 scripts/x.js → 项目 x.js);同名 basename 撞车时后者覆盖前者
|
|
34
34
|
|
|
35
35
|
前置
|
|
36
|
-
|
|
36
|
+
当前工作目录已走过 'miaoda app init',且 .spark/meta.json 的 stack 有对应
|
|
37
37
|
registry 包(当前支持 design-html / html);其余 stack 执行时报 REGISTRY_STACK_UNSUPPORTED
|
|
38
|
+
meta 一律从 cwd 读取,add 的 --dir 只影响 copy-in 落地目录
|
|
38
39
|
`);
|
|
39
40
|
registerRegistryList(registryCmd);
|
|
40
41
|
registerRegistryAdd(registryCmd);
|
|
@@ -43,7 +44,6 @@ function registerRegistryList(parent) {
|
|
|
43
44
|
const cmd = parent
|
|
44
45
|
.command('list')
|
|
45
46
|
.description('列出 registry 可用 SDK 条目,输出各文件的 USAGE 块原文')
|
|
46
|
-
.option('--dir <path>', '项目目录,默认当前目录', '.')
|
|
47
47
|
.option('--version <ver>', 'registry 包版本或 dist-tag,缺省 latest')
|
|
48
48
|
.addHelpText('after', `
|
|
49
49
|
输出
|
|
@@ -59,7 +59,6 @@ JSON 输出
|
|
|
59
59
|
`);
|
|
60
60
|
cmd.action((0, shared_1.withHelp)(cmd, async (rawOpts) => {
|
|
61
61
|
await (0, index_1.handleRegistryList)({
|
|
62
|
-
dir: rawOpts.dir,
|
|
63
62
|
version: rawOpts.version,
|
|
64
63
|
});
|
|
65
64
|
}));
|
|
@@ -69,7 +68,7 @@ function registerRegistryAdd(parent) {
|
|
|
69
68
|
.command('add')
|
|
70
69
|
.description('把一个或多个 SDK 文件 copy-in 到当前项目(拍平到项目根,含 Depends 闭包)')
|
|
71
70
|
.argument('<token...>', 'name / 完整文件名 / relPath,可传多个;同名多匹配全拉,Depends 自动传递解析')
|
|
72
|
-
.option('--dir <path>', '
|
|
71
|
+
.option('--dir <path>', 'copy-in 落地目录,默认当前目录(stack 一律读 cwd 的 .spark/meta.json)', '.')
|
|
73
72
|
.option('--version <ver>', 'registry 包版本或 dist-tag,缺省 latest')
|
|
74
73
|
.option('--overwrite', '目标文件已存在时覆盖(默认跳过以保护用户改动)', false)
|
|
75
74
|
.option('--dry-run', '只报告将写 / 将跳哪些文件,不落盘', false)
|
|
@@ -77,8 +76,9 @@ function registerRegistryAdd(parent) {
|
|
|
77
76
|
行为
|
|
78
77
|
- token 寻址:name(foo)/ 完整文件名(foo.css)/ relPath(stylesheets/foo.css)任一形式
|
|
79
78
|
- 多匹配全拉:token 命中多个同名条目时全部 copy-in;想只要其一就写完整文件名 / relPath
|
|
80
|
-
- 解析 USAGE 块 Depends 传递闭包,把 SDK
|
|
81
|
-
(包根 scripts/deck-stage.js →
|
|
79
|
+
- 解析 USAGE 块 Depends 传递闭包,把 SDK 文件**拍平**拷到落地目录(--dir,默认当前目录)
|
|
80
|
+
(包根 scripts/deck-stage.js → 落地 deck-stage.js;同名 basename 撞车时后者覆盖前者)
|
|
81
|
+
- stack 一律读当前工作目录的 .spark/meta.json,--dir 不影响 meta 读取
|
|
82
82
|
- skip-by-disk:目标文件已存在默认跳过;--overwrite 才覆盖
|
|
83
83
|
- 不写任何安装记账文件(项目文件树即状态)
|
|
84
84
|
|
|
@@ -13,7 +13,8 @@ const output_1 = require("../../../utils/output");
|
|
|
13
13
|
* miaoda registry add <name...> [--overwrite] [--dry-run] [--dir <path>] [--version <ver>]
|
|
14
14
|
*
|
|
15
15
|
* 解析 USAGE 块 Depends 传递闭包,把每个条目对应的 SDK 文件从 registry 包根的 <relPath>
|
|
16
|
-
*
|
|
16
|
+
* **保留相对路径**拷到落地目录(--dir,默认 cwd)。stack 一律从 <cwd>/.spark/meta.json 读,
|
|
17
|
+
* 不随 --dir 走。
|
|
17
18
|
* skip-by-disk:目标已存在默认跳过,--overwrite 才覆盖。不写任何安装记账文件。
|
|
18
19
|
*/
|
|
19
20
|
async function handleRegistryAdd(opts) {
|
|
@@ -22,7 +23,7 @@ async function handleRegistryAdd(opts) {
|
|
|
22
23
|
throw new error_1.AppError('ARGS_INVALID', 'registry add 至少需要一个条目名');
|
|
23
24
|
}
|
|
24
25
|
const targetDir = node_path_1.default.resolve(opts.dir ?? process.cwd());
|
|
25
|
-
const stack = (0, shared_1.resolveRegistryStack)(
|
|
26
|
+
const stack = (0, shared_1.resolveRegistryStack)();
|
|
26
27
|
const reg = (0, index_1.loadRegistry)({ stack, version: opts.version });
|
|
27
28
|
try {
|
|
28
29
|
const plan = (0, index_1.planAdd)({
|
|
@@ -1,17 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.handleRegistryList = handleRegistryList;
|
|
7
|
-
const node_path_1 = __importDefault(require("node:path"));
|
|
8
4
|
const index_1 = require("../../../services/registry/index");
|
|
9
5
|
const shared_1 = require("./shared");
|
|
10
6
|
const output_1 = require("../../../utils/output");
|
|
11
7
|
/**
|
|
12
|
-
* miaoda registry list [--
|
|
8
|
+
* miaoda registry list [--version <ver>]
|
|
13
9
|
*
|
|
14
|
-
* 从
|
|
10
|
+
* 从 <cwd>/.spark/meta.json 读 stack → runtime → 包名,拉对应 registry 包,从包根递归扫含 USAGE 块的 SDK 文件。
|
|
15
11
|
*
|
|
16
12
|
* - 默认(pretty):输出各条目 USAGE 块原文,带文件名分隔,给 Agent 直接读注释。
|
|
17
13
|
* - --json:输出 [{name, file, usage(原文字符串), dependsOn[]}],usage 保持原文不解析成字段。
|
|
@@ -19,8 +15,7 @@ const output_1 = require("../../../utils/output");
|
|
|
19
15
|
*/
|
|
20
16
|
async function handleRegistryList(opts) {
|
|
21
17
|
await Promise.resolve();
|
|
22
|
-
const
|
|
23
|
-
const stack = (0, shared_1.resolveRegistryStack)(targetDir);
|
|
18
|
+
const stack = (0, shared_1.resolveRegistryStack)();
|
|
24
19
|
const reg = (0, index_1.loadRegistry)({ stack, version: opts.version });
|
|
25
20
|
try {
|
|
26
21
|
if ((0, output_1.isJsonMode)()) {
|
|
@@ -5,16 +5,20 @@ const spark_meta_1 = require("../../../utils/spark-meta");
|
|
|
5
5
|
const index_1 = require("../../../services/registry/index");
|
|
6
6
|
const error_1 = require("../../../utils/error");
|
|
7
7
|
/**
|
|
8
|
-
* 从 <
|
|
8
|
+
* 从 <cwd>/.spark/meta.json 读 stack,校验该 stack 有组件 registry。
|
|
9
|
+
* meta 只与当前工作目录相关(CLI 必须在 user app 根目录下运行),不随 --dir 走——
|
|
10
|
+
* --dir 只影响 add 的 copy-in 落地目录。
|
|
9
11
|
* 缺 stack → 提示先 init;stack 无 registry(无对应 runtime / runtime 无 registry 包)→ 提示支持哪些 stack。
|
|
10
12
|
*
|
|
11
13
|
* 这里只做「stack 是否在支持列表」的早校验给用户友好提示;包名的两跳解析
|
|
12
14
|
* (stack → runtime → 包)由 loadRegistry/resolveRegistryPackage 负责。
|
|
13
15
|
*/
|
|
14
|
-
function resolveRegistryStack(
|
|
15
|
-
const meta = (0, spark_meta_1.readSparkMeta)(
|
|
16
|
+
function resolveRegistryStack() {
|
|
17
|
+
const meta = (0, spark_meta_1.readSparkMeta)(process.cwd());
|
|
16
18
|
if (meta.stack === undefined || meta.stack === '') {
|
|
17
|
-
throw new error_1.AppError('REGISTRY_META_INCOMPLETE', '.spark/meta.json missing stack — run `miaoda app init` first'
|
|
19
|
+
throw new error_1.AppError('REGISTRY_META_INCOMPLETE', '.spark/meta.json missing stack — run `miaoda app init` first', {
|
|
20
|
+
next_actions: ['meta 一律读当前工作目录(不随 --dir),请 cd 到 user app 根目录后重试'],
|
|
21
|
+
});
|
|
18
22
|
}
|
|
19
23
|
if (!index_1.REGISTRY_SUPPORTED_STACKS.includes(meta.stack)) {
|
|
20
24
|
throw new error_1.AppError('REGISTRY_STACK_UNSUPPORTED', `stack "${meta.stack}" 没有组件 registry`, {
|
|
@@ -128,7 +128,16 @@ function syncSandboxSkills(opts) {
|
|
|
128
128
|
(0, logger_1.debug)(`sandbox-skills: no npm version matched -alpha.${lane}, fallback to @latest ` +
|
|
129
129
|
`(TCC 里的 X 可能是老 lane dist-tag 命名 / 已 unpublish / npm view 挂 / 网络断)`);
|
|
130
130
|
}
|
|
131
|
-
|
|
131
|
+
// 版本优先级:lane(TCC 显式定向)> BOE 默认 @dev > @latest
|
|
132
|
+
//
|
|
133
|
+
// `dev` 通道由 miaoda-coding 的 publish-sandbox-skills-dev.sh 在 develop 分支自动发布
|
|
134
|
+
// (`<base>-dev.<sha>` + dist-tag `dev`),口径与 coding-steering 完全一致 ——
|
|
135
|
+
// 后者在本仓 coding-steering 侧也是 `FORCE_FRAMEWORK_ENVIRONMENT=boe` 时默认取 `dev`。
|
|
136
|
+
//
|
|
137
|
+
// lane 必须压过 dev:TCC 里配了 tgz-key 就说明是定向灰度(钉某个 feat 分支的快照),
|
|
138
|
+
// 不能被"BOE 就跟 develop"这条默认规则覆盖掉。
|
|
139
|
+
const isBoe = process.env.FORCE_FRAMEWORK_ENVIRONMENT === 'boe';
|
|
140
|
+
const primaryVersion = laneVersion ?? (isBoe ? 'dev' : 'latest');
|
|
132
141
|
try {
|
|
133
142
|
(0, logger_1.debug)(`sandbox-skills: fetching ${packageName}@${primaryVersion}`);
|
|
134
143
|
fetched = (0, npm_pack_1.fetchNpmPackage)({
|
|
@@ -138,6 +147,9 @@ function syncSandboxSkills(opts) {
|
|
|
138
147
|
});
|
|
139
148
|
}
|
|
140
149
|
catch (err) {
|
|
150
|
+
// @latest 是最后一档,它再挂就没得降了,直接抛。
|
|
151
|
+
// lane / dev 拉失败都降到 @latest:dev 通道可能因为 develop 还没发过包而不存在
|
|
152
|
+
// (dist-tag 缺失 → npm pack 404),这时候不该让整条 sync 挂掉。
|
|
141
153
|
if (primaryVersion === 'latest') {
|
|
142
154
|
throw err;
|
|
143
155
|
}
|