openxiangda-cli 2.3.1 → 2.4.2
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/bin/run.js +10 -1
- package/dist/commands/design.d.ts +7 -0
- package/dist/commands/design.d.ts.map +1 -0
- package/dist/commands/design.js +8 -0
- package/dist/commands/design.js.map +1 -0
- package/dist/design-native.d.ts +26 -0
- package/dist/design-native.d.ts.map +1 -0
- package/dist/design-native.js +165 -0
- package/dist/design-native.js.map +1 -0
- package/package.json +4 -4
- package/template/AGENTS.md +2 -1
- package/template/apps/web/package.json +1 -1
- package/template/package.json +1 -1
package/bin/run.js
CHANGED
|
@@ -7,7 +7,16 @@ import { DEVKIT_COMMANDS } from 'openxiangda-devkit-core';
|
|
|
7
7
|
const publicCommands = new Set(DEVKIT_COMMANDS.map(command => command.id));
|
|
8
8
|
const args = process.argv.slice(2);
|
|
9
9
|
|
|
10
|
-
if (args
|
|
10
|
+
if (args[0] === 'design') {
|
|
11
|
+
// Native arguments and JSON/stdio belong to OpenDesign, including its MCP.
|
|
12
|
+
try {
|
|
13
|
+
const { runDesign } = await import('../dist/design-native.js');
|
|
14
|
+
process.exitCode = await runDesign(args.slice(1));
|
|
15
|
+
} catch (error) {
|
|
16
|
+
process.stderr.write(`${error instanceof Error ? error.message : error}\n`);
|
|
17
|
+
process.exitCode = 1;
|
|
18
|
+
}
|
|
19
|
+
} else if (args.includes('--mcp-stdio')) {
|
|
11
20
|
const allowed = new Set(['--mcp-stdio', '--cwd']);
|
|
12
21
|
for (let index = 0; index < args.length; index += 1) {
|
|
13
22
|
const argument = args[index];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"design.d.ts","sourceRoot":"","sources":["../../src/commands/design.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IACzC,MAAM,CAAC,OAAO,SAAiC;IAC/C,MAAM,CAAC,MAAM,UAAS;IAChB,GAAG;CACV"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
import { runDesign } from '../design-native.js';
|
|
3
|
+
export default class Design extends Command {
|
|
4
|
+
static summary = '打开 OpenDesign 原版并透传完整原生 CLI';
|
|
5
|
+
static strict = false;
|
|
6
|
+
async run() { process.exitCode = await runDesign(this.argv); }
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=design.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"design.js","sourceRoot":"","sources":["../../src/commands/design.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IACzC,MAAM,CAAC,OAAO,GAAG,6BAA6B,CAAC;IAC/C,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,KAAK,CAAC,GAAG,KAAK,OAAO,CAAC,QAAQ,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface DesignInstallation {
|
|
2
|
+
kind: 'desktop' | 'cli';
|
|
3
|
+
cli: string;
|
|
4
|
+
command: string;
|
|
5
|
+
prefix: string[];
|
|
6
|
+
version?: string;
|
|
7
|
+
appPath?: string;
|
|
8
|
+
sidecarPath?: string;
|
|
9
|
+
releasePath?: string;
|
|
10
|
+
namespace?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function discoverOpenDesign(options?: {
|
|
13
|
+
env?: NodeJS.ProcessEnv;
|
|
14
|
+
platform?: NodeJS.Platform;
|
|
15
|
+
home?: string;
|
|
16
|
+
desktopPaths?: string[];
|
|
17
|
+
}): DesignInstallation;
|
|
18
|
+
export declare function verifyOpenDesign(installation: DesignInstallation, env?: NodeJS.ProcessEnv): void;
|
|
19
|
+
export declare function desktopRuntime(installation: DesignInstallation): Promise<{
|
|
20
|
+
url: string;
|
|
21
|
+
mode: string;
|
|
22
|
+
pid: number;
|
|
23
|
+
} | null>;
|
|
24
|
+
export declare function forwardOpenDesign(installation: DesignInstallation, args: string[], env?: NodeJS.ProcessEnv): Promise<number>;
|
|
25
|
+
export declare function runDesign(args: string[]): Promise<number>;
|
|
26
|
+
//# sourceMappingURL=design-native.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"design-native.d.ts","sourceRoot":"","sources":["../src/design-native.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,SAAS,GAAG,KAAK,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA0BD,wBAAgB,kBAAkB,CAAC,OAAO,GAAE;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,GAAG,kBAAkB,CAgC1B;AAED,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,kBAAkB,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,QAOtG;AAED,wBAAsB,cAAc,CAAC,YAAY,EAAE,kBAAkB;;;SAgBZ,MAAM;UAU9D;AAED,wBAAsB,iBAAiB,CAAC,YAAY,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,mBAU7H;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,mBAwB7C"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { spawn, spawnSync } from 'node:child_process';
|
|
2
|
+
import { existsSync, readFileSync, realpathSync, statSync } from 'node:fs';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
5
|
+
import { pathToFileURL } from 'node:url';
|
|
6
|
+
const releases = 'https://github.com/nexu-io/open-design/releases/latest';
|
|
7
|
+
const probeToken = 'open-design-cli:mcp-install:v1';
|
|
8
|
+
const help = `OpenDesign 原版入口
|
|
9
|
+
|
|
10
|
+
openxiangda design open 打开原版桌面;显式 CLI 安装启动原生服务
|
|
11
|
+
openxiangda design status [--json] 查看安装、原版版本与当前桌面服务
|
|
12
|
+
openxiangda design cli <args...> 原样运行完整原生 CLI(参数和输出归上游)
|
|
13
|
+
openxiangda design cli --help 查看原版命令帮助
|
|
14
|
+
openxiangda design cli mcp 运行原版 stdio MCP
|
|
15
|
+
|
|
16
|
+
安装:${releases}
|
|
17
|
+
macOS 自动发现 /Applications 或 ~/Applications 中的 Open Design.app。
|
|
18
|
+
其他安装使用绝对路径 OPENXIANGDA_OPENDESIGN_CLI(或原生 OD_BIN),
|
|
19
|
+
JS 入口可使用 OD_NODE_BIN 指定原版 Node 运行时。不会搜索 PATH 中的 od。
|
|
20
|
+
原版更新、Agent 登录和设计项目由 OpenDesign 管理。
|
|
21
|
+
`;
|
|
22
|
+
function failure(code, message) {
|
|
23
|
+
throw new Error(`${code}: ${message}`);
|
|
24
|
+
}
|
|
25
|
+
function absoluteFile(value) {
|
|
26
|
+
if (!isAbsolute(value) || !existsSync(value) || !statSync(value).isFile()) {
|
|
27
|
+
failure('OPENDESIGN_ENTRY_INVALID', '需要存在的绝对文件路径');
|
|
28
|
+
}
|
|
29
|
+
return realpathSync(value);
|
|
30
|
+
}
|
|
31
|
+
function readConfig(file) {
|
|
32
|
+
if (statSync(file).size > 64 * 1024)
|
|
33
|
+
failure('OPENDESIGN_CONFIG_INVALID', '配置超过 64 KiB');
|
|
34
|
+
return JSON.parse(readFileSync(file, 'utf8'));
|
|
35
|
+
}
|
|
36
|
+
function bundledFile(root, value) {
|
|
37
|
+
if (typeof value !== 'string' || !value || isAbsolute(value))
|
|
38
|
+
failure('OPENDESIGN_CONFIG_INVALID', '包内入口必须是相对路径');
|
|
39
|
+
const file = absoluteFile(resolve(root, value));
|
|
40
|
+
const part = relative(realpathSync(root), file);
|
|
41
|
+
if (part === '..' || part.startsWith(`..${sep}`) || isAbsolute(part))
|
|
42
|
+
failure('OPENDESIGN_CONFIG_INVALID', '入口超出原版安装包');
|
|
43
|
+
return file;
|
|
44
|
+
}
|
|
45
|
+
export function discoverOpenDesign(options = {}) {
|
|
46
|
+
const env = options.env ?? process.env;
|
|
47
|
+
const explicit = env.OPENXIANGDA_OPENDESIGN_CLI || env.OD_BIN;
|
|
48
|
+
if (explicit) {
|
|
49
|
+
const cli = absoluteFile(explicit);
|
|
50
|
+
const script = /\.[cm]?js$/i.test(cli);
|
|
51
|
+
return { kind: 'cli', cli, command: script ? (env.OD_NODE_BIN ? absoluteFile(env.OD_NODE_BIN) : process.execPath) : cli, prefix: script ? [cli] : [] };
|
|
52
|
+
}
|
|
53
|
+
const candidates = options.desktopPaths ?? ((options.platform ?? process.platform) === 'darwin'
|
|
54
|
+
? ['/Applications/Open Design.app', join(options.home ?? homedir(), 'Applications/Open Design.app')]
|
|
55
|
+
: []);
|
|
56
|
+
for (const appPath of candidates) {
|
|
57
|
+
if (!existsSync(appPath))
|
|
58
|
+
continue;
|
|
59
|
+
const resources = join(appPath, 'Contents/Resources');
|
|
60
|
+
const configFile = join(resources, 'open-design-config.json');
|
|
61
|
+
if (!existsSync(configFile))
|
|
62
|
+
failure('OPENDESIGN_CONFIG_INVALID', '原版安装缺少 open-design-config.json');
|
|
63
|
+
const config = readConfig(configFile);
|
|
64
|
+
const manifest = readConfig(join(resources, 'app/package.json'));
|
|
65
|
+
if (manifest.name !== 'open-design-packaged-app' || typeof config.namespace !== 'string' || !/^[a-zA-Z0-9_-]+$/.test(config.namespace)) {
|
|
66
|
+
failure('OPENDESIGN_CONFIG_INVALID', '不支持的原版包标识或命名空间');
|
|
67
|
+
}
|
|
68
|
+
const cli = bundledFile(resources, config.daemonCliEntryRelative);
|
|
69
|
+
const version = typeof config.appVersion === 'string' ? config.appVersion : String(manifest.version);
|
|
70
|
+
return {
|
|
71
|
+
kind: 'desktop', appPath: realpathSync(appPath), cli,
|
|
72
|
+
command: process.execPath, prefix: [cli], version,
|
|
73
|
+
sidecarPath: bundledFile(resources, 'app/node_modules/@open-design/sidecar/dist/index.mjs'),
|
|
74
|
+
releasePath: bundledFile(resources, 'app/node_modules/@open-design/release/dist/index.mjs'),
|
|
75
|
+
namespace: config.namespace,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
failure('OPENDESIGN_NOT_INSTALLED', `请安装原版 OpenDesign:${releases};其他安装指定 OPENXIANGDA_OPENDESIGN_CLI`);
|
|
79
|
+
}
|
|
80
|
+
export function verifyOpenDesign(installation, env = process.env) {
|
|
81
|
+
const result = spawnSync(installation.command, [...installation.prefix, 'mcp', 'install', '--open-design-cli-probe'], {
|
|
82
|
+
env, encoding: 'utf8', timeout: 5000, maxBuffer: 64 * 1024, windowsHide: true,
|
|
83
|
+
});
|
|
84
|
+
if (result.error || result.status !== 0 || result.stdout.trim() !== probeToken) {
|
|
85
|
+
failure('OPENDESIGN_ENTRY_UNRECOGNIZED', '入口未通过原版 CLI 身份探测;检查安装或显式路径');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
export async function desktopRuntime(installation) {
|
|
89
|
+
if (!installation.sidecarPath)
|
|
90
|
+
return null;
|
|
91
|
+
const upstream = await import(pathToFileURL(installation.sidecarPath).href);
|
|
92
|
+
const release = installation.releasePath ? await import(pathToFileURL(installation.releasePath).href) : null;
|
|
93
|
+
if (typeof upstream.getSidecarStatus !== 'function' || typeof release?.releaseChannelFromNamespace !== 'function')
|
|
94
|
+
failure('OPENDESIGN_RUNTIME_API_CHANGED', '原版运行发现接口已变化,请更新享搭桥接或指定原生 CLI 环境');
|
|
95
|
+
const channel = release.releaseChannelFromNamespace(installation.namespace);
|
|
96
|
+
if (!channel)
|
|
97
|
+
failure('OPENDESIGN_CONFIG_INVALID', '原版无法识别安装版本所属通道');
|
|
98
|
+
const stamp = { app: 'daemon', channel, namespace: installation.namespace, source: 'packaged' };
|
|
99
|
+
for (const mode of ['runtime', 'headless']) {
|
|
100
|
+
try {
|
|
101
|
+
const status = await upstream.getSidecarStatus({ ...stamp, mode }, { timeoutMs: 1000 });
|
|
102
|
+
if (status?.state !== 'running' || typeof status.url !== 'string')
|
|
103
|
+
continue;
|
|
104
|
+
const url = new URL(status.url);
|
|
105
|
+
if (url.protocol !== 'http:' || !['127.0.0.1', '[::1]', 'localhost'].includes(url.hostname) || url.username || url.password) {
|
|
106
|
+
failure('OPENDESIGN_RUNTIME_INVALID', '原版桌面返回了非本地服务地址');
|
|
107
|
+
}
|
|
108
|
+
return { url: url.origin, mode, pid: status.pid };
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
if (error instanceof Error && error.message.startsWith('OPENDESIGN_'))
|
|
112
|
+
throw error;
|
|
113
|
+
const code = error.code;
|
|
114
|
+
if (!['ENOENT', 'ECONNREFUSED', 'ETIMEDOUT'].includes(code ?? '')) {
|
|
115
|
+
failure('OPENDESIGN_RUNTIME_UNAVAILABLE', String(error));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
export async function forwardOpenDesign(installation, args, env = process.env) {
|
|
122
|
+
return await new Promise((resolveExit, reject) => {
|
|
123
|
+
const child = spawn(installation.command, [...installation.prefix, ...args], { env, stdio: 'inherit', shell: false, windowsHide: true });
|
|
124
|
+
const signals = ['SIGINT', 'SIGTERM'];
|
|
125
|
+
const listeners = signals.map(signal => () => { child.kill(signal); });
|
|
126
|
+
signals.forEach((signal, index) => process.on(signal, listeners[index]));
|
|
127
|
+
const cleanup = () => signals.forEach((signal, index) => process.off(signal, listeners[index]));
|
|
128
|
+
child.once('error', error => { cleanup(); reject(error); });
|
|
129
|
+
child.once('exit', (code, signal) => { cleanup(); resolveExit(code ?? (signal === 'SIGINT' ? 130 : signal === 'SIGTERM' ? 143 : 1)); });
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
export async function runDesign(args) {
|
|
133
|
+
if (args[0] === '--help' || args[0] === '-h') {
|
|
134
|
+
process.stdout.write(help);
|
|
135
|
+
return 0;
|
|
136
|
+
}
|
|
137
|
+
const action = args[0] ?? 'open';
|
|
138
|
+
if (!['open', 'status', 'cli'].includes(action))
|
|
139
|
+
failure('OPENDESIGN_ACTION_INVALID', '使用 design open、status 或 cli <原生参数>');
|
|
140
|
+
if (action !== 'cli' && args.slice(1).some(arg => action !== 'status' || arg !== '--json'))
|
|
141
|
+
failure('OPENDESIGN_ARGUMENT_INVALID', '原版参数应放在 design cli 后面');
|
|
142
|
+
const installation = discoverOpenDesign();
|
|
143
|
+
verifyOpenDesign(installation);
|
|
144
|
+
if (action === 'open') {
|
|
145
|
+
if (installation.appPath)
|
|
146
|
+
return await forwardOpenDesign({ ...installation, command: '/usr/bin/open', prefix: ['-a', installation.appPath] }, []);
|
|
147
|
+
return await forwardOpenDesign(installation, []);
|
|
148
|
+
}
|
|
149
|
+
const runtime = await desktopRuntime(installation);
|
|
150
|
+
if (action === 'status') {
|
|
151
|
+
const data = { installed: true, kind: installation.kind, version: installation.version ?? null, cli: installation.cli, runtime, daemonUrlOverride: Boolean(process.env.OD_DAEMON_URL), upstream: releases };
|
|
152
|
+
process.stdout.write(args.includes('--json') ? `${JSON.stringify(data)}\n` : `OpenDesign ${data.version ?? '(原生 CLI)'}\n${installation.cli}\n${runtime ? `运行中:${runtime.url}` : '未发现桌面服务;运行 design open,或沿用显式原生环境'}\n`);
|
|
153
|
+
return 0;
|
|
154
|
+
}
|
|
155
|
+
const nativeArgs = args.slice(1);
|
|
156
|
+
if (nativeArgs[0] === '--')
|
|
157
|
+
nativeArgs.shift();
|
|
158
|
+
if (!nativeArgs.length)
|
|
159
|
+
failure('OPENDESIGN_ARGUMENT_INVALID', '使用 design open 启动,或 design cli --help 查看原版命令');
|
|
160
|
+
return await forwardOpenDesign(installation, nativeArgs, {
|
|
161
|
+
...process.env,
|
|
162
|
+
...(runtime && !process.env.OD_DAEMON_URL ? { OD_DAEMON_URL: runtime.url } : {}),
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=design-native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"design-native.js","sourceRoot":"","sources":["../src/design-native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,QAAQ,GAAG,wDAAwD,CAAC;AAC1E,MAAM,UAAU,GAAG,gCAAgC,CAAC;AACpD,MAAM,IAAI,GAAG;;;;;;;;KAQR,QAAQ;;;;;CAKZ,CAAC;AAcF,SAAS,OAAO,CAAC,IAAY,EAAE,OAAe;IAC5C,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QAC1E,OAAO,CAAC,0BAA0B,EAAE,aAAa,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI;QAAE,OAAO,CAAC,2BAA2B,EAAE,aAAa,CAAC,CAAC;IACzF,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,KAAc;IAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,2BAA2B,EAAE,aAAa,CAAC,CAAC;IAClH,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;IAChD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,2BAA2B,EAAE,WAAW,CAAC,CAAC;IACxH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,UAK/B,EAAE;IACJ,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,QAAQ,GAAG,GAAG,CAAC,0BAA0B,IAAI,GAAG,CAAC,MAAM,CAAC;IAC9D,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACzJ,CAAC;IACD,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,QAAQ;QAC7F,CAAC,CAAC,CAAC,+BAA+B,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,EAAE,EAAE,8BAA8B,CAAC,CAAC;QACpG,CAAC,CAAC,EAAE,CAAC,CAAC;IACR,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE,CAAC;QACjC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,SAAS;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,yBAAyB,CAAC,CAAC;QAC9D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,CAAC,2BAA2B,EAAE,gCAAgC,CAAC,CAAC;QACpG,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC;QACjE,IAAI,QAAQ,CAAC,IAAI,KAAK,0BAA0B,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YACvI,OAAO,CAAC,2BAA2B,EAAE,gBAAgB,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,GAAG,GAAG,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACrG,OAAO;YACL,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,GAAG;YACpD,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO;YACjD,WAAW,EAAE,WAAW,CAAC,SAAS,EAAE,sDAAsD,CAAC;YAC3F,WAAW,EAAE,WAAW,CAAC,SAAS,EAAE,sDAAsD,CAAC;YAC3F,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,0BAA0B,EAAE,oBAAoB,QAAQ,oCAAoC,CAAC,CAAC;AACxG,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,YAAgC,EAAE,MAAyB,OAAO,CAAC,GAAG;IACrG,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,yBAAyB,CAAC,EAAE;QACpH,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,IAAI;KAC9E,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,UAAU,EAAE,CAAC;QAC/E,OAAO,CAAC,+BAA+B,EAAE,4BAA4B,CAAC,CAAC;IACzE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,YAAgC;IACnE,IAAI,CAAC,YAAY,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7G,IAAI,OAAO,QAAQ,CAAC,gBAAgB,KAAK,UAAU,IAAI,OAAO,OAAO,EAAE,2BAA2B,KAAK,UAAU;QAAE,OAAO,CAAC,gCAAgC,EAAE,iCAAiC,CAAC,CAAC;IAChM,MAAM,OAAO,GAAG,OAAO,CAAC,2BAA2B,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAC5E,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,2BAA2B,EAAE,gBAAgB,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAChG,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,CAAC;QAC3C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxF,IAAI,MAAM,EAAE,KAAK,KAAK,SAAS,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ;gBAAE,SAAS;YAC5E,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,CAAC,WAAW,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;gBAC5H,OAAO,CAAC,4BAA4B,EAAE,gBAAgB,CAAC,CAAC;YAC1D,CAAC;YACD,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,GAAa,EAAE,CAAC;QAC9D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC;gBAAE,MAAM,KAAK,CAAC;YACnF,MAAM,IAAI,GAAI,KAA+B,CAAC,IAAI,CAAC;YACnD,IAAI,CAAC,CAAC,QAAQ,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;gBAClE,OAAO,CAAC,gCAAgC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,YAAgC,EAAE,IAAc,EAAE,MAAyB,OAAO,CAAC,GAAG;IAC5H,OAAO,MAAM,IAAI,OAAO,CAAS,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE;QACvD,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACzI,MAAM,OAAO,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAU,CAAC;QAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,CAAE,CAAC,CAAC,CAAC;QAC1E,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,CAAE,CAAC,CAAC,CAAC;QACjG,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1I,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAc;IAC5C,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAAC,OAAO,CAAC,CAAC;IAAC,CAAC;IACvF,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IACjC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,2BAA2B,EAAE,oCAAoC,CAAC,CAAC;IAC5H,IAAI,MAAM,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,KAAK,QAAQ,CAAC;QAAE,OAAO,CAAC,6BAA6B,EAAE,uBAAuB,CAAC,CAAC;IAC5J,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAC;IAC1C,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC/B,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,IAAI,YAAY,CAAC,OAAO;YAAE,OAAO,MAAM,iBAAiB,CAAC,EAAE,GAAG,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAClJ,OAAO,MAAM,iBAAiB,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,CAAC;IACnD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,IAAI,IAAI,EAAE,GAAG,EAAE,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;QAC5M,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,OAAO,IAAI,UAAU,KAAK,YAAY,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,kCAAkC,IAAI,CAAC,CAAC;QACxN,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI;QAAE,UAAU,CAAC,KAAK,EAAE,CAAC;IAC/C,IAAI,CAAC,UAAU,CAAC,MAAM;QAAE,OAAO,CAAC,6BAA6B,EAAE,8CAA8C,CAAC,CAAC;IAC/G,OAAO,MAAM,iBAAiB,CAAC,YAAY,EAAE,UAAU,EAAE;QACvD,GAAG,OAAO,CAAC,GAAG;QACd,GAAG,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjF,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "openxiangda-cli",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.2",
|
|
4
4
|
"description": "OpenXiangda 2.0 应用生命周期命令、创建器与模板。",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -22,9 +22,9 @@
|
|
|
22
22
|
"dependencies": {
|
|
23
23
|
"@oclif/core": "4.13.3",
|
|
24
24
|
"openxiangda-contracts": "2.11.0",
|
|
25
|
-
"openxiangda-devkit-core": "2.
|
|
26
|
-
"openxiangda-mcp": "2.0.
|
|
27
|
-
"openxiangda-skill-kit": "2.
|
|
25
|
+
"openxiangda-devkit-core": "2.9.0",
|
|
26
|
+
"openxiangda-mcp": "2.0.17",
|
|
27
|
+
"openxiangda-skill-kit": "2.1.1"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"tsx": "4.23.12",
|
package/template/AGENTS.md
CHANGED
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
- 模型、页面、导航和权限由应用声明一次;编译器生成契约。业务代码不改生成结果、不创建 platform/data、不复制平台 Router、字段组件、客户端或权限状态。
|
|
9
9
|
- 当前用户、角色并集、数据授权和部署状态归平台;应用不保存凭据或授权快照。普通 CRUD 走 Data API,真实业务动作才按需启用 Nest。
|
|
10
10
|
- 标准业务字段使用 `openxiangda/field-kit`;PC 补充控件使用 antd,移动使用有作用域的 `openxiangda/mobile` 和 MobileSurface,不引入上游全局重置。
|
|
11
|
-
-
|
|
11
|
+
- 界面开发默认按 docs design-workflow 使用原版 OpenDesign 桌面和 design cli先设计整体视觉、可运行原型并实际走查,再实现。设备由真实任务决定;复用 Shell 导航事实、标准字段行为,通过 ui 和局部样式应用设计,不复制权限或导航状态。原型和 tokens 以 AppSpec assets 固定。模板 /home 不替代页面选型。
|
|
12
|
+
- 应用默认先建立并保留标准管理后台:后台 Shell、显式菜单、资源表单、数据列表、详情/编辑、权限和流程入口是应用骨架。OpenDesign 可优化后台外观但不能替换后台;用户端 PC 与移动端可分别使用 OpenDesign 的完整视觉和交互,通过 runtime/Data API 读取后台数据。禁止用单页 HTML、iframe 或独立假后台替代后台,发布前分别验收后台与用户端入口。
|
|
12
13
|
- 图表等专业交互先检查现有依赖并评估成熟组件/开源库,报表优先评估 ECharts,按需加载并释放实例;平台数据、权限与聚合仍通过官方能力。详见 docs frontend。
|
|
13
14
|
- 入口与导航验收从平台应用列表开始,检查应用根路径、后台首个有权菜单、登录返回及刷新深链接;不能只验证开发者给出的业务链接。
|
|
14
15
|
- 无账号表单读取 `docs public-access`,使用 frontend.publicAccess 和专用客户端;标准审批、通知和后端均按需启用。
|