openxiangda-devkit-core 2.0.0-alpha.113 → 2.0.0-alpha.115

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.
@@ -0,0 +1,103 @@
1
+ /** 使用指南的唯一主题目录;正文从同版本根包读取。 */
2
+ export declare const DOCUMENTATION_TOPICS: readonly [{
3
+ readonly id: "getting-started";
4
+ readonly title: "安装与开始开发";
5
+ readonly file: "getting-started.md";
6
+ }, {
7
+ readonly id: "development";
8
+ readonly title: "需求与开发流程";
9
+ readonly file: "development.md";
10
+ }, {
11
+ readonly id: "application-foundation";
12
+ readonly title: "业务模型与标准 CRUD";
13
+ readonly file: "application-foundation.md";
14
+ }, {
15
+ readonly id: "appspec";
16
+ readonly title: "可选的业务需求记录";
17
+ readonly file: "appspec.md";
18
+ }, {
19
+ readonly id: "concepts";
20
+ readonly title: "架构与能力所有者";
21
+ readonly file: "concepts.md";
22
+ }, {
23
+ readonly id: "frontend";
24
+ readonly title: "页面与标准组件扩展";
25
+ readonly file: "frontend.md";
26
+ }, {
27
+ readonly id: "field-components";
28
+ readonly title: "字段、表单与移动控件";
29
+ readonly file: "field-components.md";
30
+ }, {
31
+ readonly id: "data-authz";
32
+ readonly title: "数据查询与权限";
33
+ readonly file: "data-authz.md";
34
+ }, {
35
+ readonly id: "public-access";
36
+ readonly title: "无账号的匿名公开访问";
37
+ readonly file: "public-access.md";
38
+ }, {
39
+ readonly id: "workflow-events";
40
+ readonly title: "审批、事件与通知";
41
+ readonly file: "workflow-events.md";
42
+ }, {
43
+ readonly id: "backend";
44
+ readonly title: "按需后端与业务动作";
45
+ readonly file: "backend.md";
46
+ }, {
47
+ readonly id: "administration";
48
+ readonly title: "应用管理与有效配置";
49
+ readonly file: "administration.md";
50
+ }, {
51
+ readonly id: "testing";
52
+ readonly title: "检查与真实业务验收";
53
+ readonly file: "testing.md";
54
+ }, {
55
+ readonly id: "delivery";
56
+ readonly title: "部署、生产晋级与恢复";
57
+ readonly file: "delivery.md";
58
+ }, {
59
+ readonly id: "upgrading";
60
+ readonly title: "版本升级与资料刷新";
61
+ readonly file: "upgrading.md";
62
+ }, {
63
+ readonly id: "cli";
64
+ readonly title: "CLI 命令参考";
65
+ readonly file: "reference/cli.md";
66
+ }, {
67
+ readonly id: "mcp";
68
+ readonly title: "MCP 配置与工具参考";
69
+ readonly file: "reference/mcp.md";
70
+ }];
71
+ /** Skill 参考文件名保留稳定入口,正文仍由中文主题生成。 */
72
+ export declare function documentationReferenceFile(id: string): string;
73
+ export declare function documentationRoot(): string;
74
+ export declare function documentationIndex(root?: string): {
75
+ schemaVersion: string;
76
+ topics: {
77
+ id: "appspec" | "delivery" | "frontend" | "backend" | "getting-started" | "development" | "application-foundation" | "concepts" | "field-components" | "data-authz" | "public-access" | "workflow-events" | "administration" | "testing" | "upgrading" | "cli" | "mcp";
78
+ title: "CLI 命令参考" | "安装与开始开发" | "需求与开发流程" | "业务模型与标准 CRUD" | "可选的业务需求记录" | "架构与能力所有者" | "页面与标准组件扩展" | "字段、表单与移动控件" | "数据查询与权限" | "无账号的匿名公开访问" | "审批、事件与通知" | "按需后端与业务动作" | "应用管理与有效配置" | "检查与真实业务验收" | "部署、生产晋级与恢复" | "版本升级与资料刷新" | "MCP 配置与工具参考";
79
+ uri: string;
80
+ version: string;
81
+ sha256: string;
82
+ bytes: number;
83
+ sections: {
84
+ id: string;
85
+ title: string;
86
+ }[];
87
+ }[];
88
+ };
89
+ export declare function readDocumentation(id: string, section?: string, root?: string): {
90
+ schemaVersion: string;
91
+ topic: string;
92
+ title: "CLI 命令参考" | "安装与开始开发" | "需求与开发流程" | "业务模型与标准 CRUD" | "可选的业务需求记录" | "架构与能力所有者" | "页面与标准组件扩展" | "字段、表单与移动控件" | "数据查询与权限" | "无账号的匿名公开访问" | "审批、事件与通知" | "按需后端与业务动作" | "应用管理与有效配置" | "检查与真实业务验收" | "部署、生产晋级与恢复" | "版本升级与资料刷新" | "MCP 配置与工具参考";
93
+ version: string;
94
+ sha256: string;
95
+ uri: string;
96
+ sections: {
97
+ id: string;
98
+ title: string;
99
+ }[];
100
+ content: string;
101
+ };
102
+ export declare function workspaceGuidanceTemplatePath(): string;
103
+ //# sourceMappingURL=documentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documentation.d.ts","sourceRoot":"","sources":["../src/documentation.ts"],"names":[],"mappings":"AAIA,8BAA8B;AAC9B,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBvB,CAAC;AAEX,oCAAoC;AACpC,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,MAAM,UAGpD;AAID,wBAAgB,iBAAiB,WAEhC;AA4CD,wBAAgB,kBAAkB,CAAC,IAAI,SAAsB;;;;;;;;;;;;;;EAW5D;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,SAAsB;;;;;;;;;;;;EAWzF;AAED,wBAAgB,6BAA6B,WAI5C"}
@@ -0,0 +1,111 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { existsSync, readFileSync, realpathSync, statSync } from 'node:fs';
3
+ import { isAbsolute, relative, resolve } from 'node:path';
4
+ /** 使用指南的唯一主题目录;正文从同版本根包读取。 */
5
+ export const DOCUMENTATION_TOPICS = [
6
+ { id: 'getting-started', title: '安装与开始开发', file: 'getting-started.md' },
7
+ { id: 'development', title: '需求与开发流程', file: 'development.md' },
8
+ { id: 'application-foundation', title: '业务模型与标准 CRUD', file: 'application-foundation.md' },
9
+ { id: 'appspec', title: '可选的业务需求记录', file: 'appspec.md' },
10
+ { id: 'concepts', title: '架构与能力所有者', file: 'concepts.md' },
11
+ { id: 'frontend', title: '页面与标准组件扩展', file: 'frontend.md' },
12
+ { id: 'field-components', title: '字段、表单与移动控件', file: 'field-components.md' },
13
+ { id: 'data-authz', title: '数据查询与权限', file: 'data-authz.md' },
14
+ { id: 'public-access', title: '无账号的匿名公开访问', file: 'public-access.md' },
15
+ { id: 'workflow-events', title: '审批、事件与通知', file: 'workflow-events.md' },
16
+ { id: 'backend', title: '按需后端与业务动作', file: 'backend.md' },
17
+ { id: 'administration', title: '应用管理与有效配置', file: 'administration.md' },
18
+ { id: 'testing', title: '检查与真实业务验收', file: 'testing.md' },
19
+ { id: 'delivery', title: '部署、生产晋级与恢复', file: 'delivery.md' },
20
+ { id: 'upgrading', title: '版本升级与资料刷新', file: 'upgrading.md' },
21
+ { id: 'cli', title: 'CLI 命令参考', file: 'reference/cli.md' },
22
+ { id: 'mcp', title: 'MCP 配置与工具参考', file: 'reference/mcp.md' },
23
+ ];
24
+ /** Skill 参考文件名保留稳定入口,正文仍由中文主题生成。 */
25
+ export function documentationReferenceFile(id) {
26
+ const aliases = { development: 'discovery', concepts: 'architecture', cli: 'commands' };
27
+ return `${aliases[id] || id}.md`;
28
+ }
29
+ const MAX_TOPIC_BYTES = 128 * 1024;
30
+ export function documentationRoot() {
31
+ return resolve(process.env.OPENXIANGDA_DOCUMENTATION_ROOT || resolve(import.meta.dirname, '../../../docs'));
32
+ }
33
+ function topicSource(id, root) {
34
+ const topic = DOCUMENTATION_TOPICS.find(item => item.id === id);
35
+ if (!topic)
36
+ throw new Error(`DOCUMENTATION_TOPIC_NOT_FOUND: 未知主题 ${id},运行 pnpm openxiangda docs 查看目录`);
37
+ const path = resolve(root, topic.file);
38
+ if (!existsSync(path))
39
+ throw new Error(`DOCUMENTATION_NOT_INSTALLED: 当前安装缺少 ${id},请通过同版本 openxiangda 根包启动`);
40
+ const resolved = realpathSync(path);
41
+ const local = relative(realpathSync(root), resolved);
42
+ if (local.startsWith('..') || isAbsolute(local))
43
+ throw new Error('DOCUMENTATION_PATH_FORBIDDEN: 文档不能越过资料目录');
44
+ if (!statSync(resolved).isFile() || statSync(resolved).size > MAX_TOPIC_BYTES) {
45
+ throw new Error('DOCUMENTATION_SIZE_EXCEEDED: 单个主题必须是大小不超过 128 KiB 的文本文档');
46
+ }
47
+ const text = readFileSync(resolved, 'utf8');
48
+ const sha256 = createHash('sha256').update(text).digest('hex');
49
+ const manifestPath = resolve(root, 'manifest.json');
50
+ const manifest = existsSync(manifestPath)
51
+ ? JSON.parse(readFileSync(manifestPath, 'utf8'))
52
+ : undefined;
53
+ if (manifest && manifest.topics.find(item => item.id === id)?.sha256 !== sha256) {
54
+ throw new Error(`DOCUMENTATION_DIGEST_MISMATCH: ${id} 与当前根包资料摘要不一致,请重新安装该精确版本`);
55
+ }
56
+ return { ...topic, text, sha256, version: manifest?.version || 'development' };
57
+ }
58
+ function sections(text) {
59
+ const lines = text.split('\n');
60
+ const found = [];
61
+ let fenced = false;
62
+ const used = new Map();
63
+ lines.forEach((line, index) => {
64
+ if (/^\s*(```|~~~)/.test(line)) {
65
+ fenced = !fenced;
66
+ return;
67
+ }
68
+ const match = !fenced && line.match(/^##\s+(.+?)(?:\s+\{#([\w-]+)\})?\s*$/);
69
+ if (!match)
70
+ return;
71
+ const title = match[1];
72
+ const base = match[2] || title.toLowerCase().replace(/[^\p{L}\p{N}]+/gu, '-').replace(/^-|-$/g, '');
73
+ const count = used.get(base) || 0;
74
+ used.set(base, count + 1);
75
+ if (found.length)
76
+ found[found.length - 1].end = index;
77
+ found.push({ id: count ? `${base}-${count + 1}` : base, title, start: index, end: lines.length });
78
+ });
79
+ return { lines, found };
80
+ }
81
+ export function documentationIndex(root = documentationRoot()) {
82
+ const topics = DOCUMENTATION_TOPICS.map(({ id }) => {
83
+ const source = topicSource(id, root);
84
+ return {
85
+ id, title: source.title, uri: `openxiangda://docs/${id}`,
86
+ version: source.version, sha256: source.sha256,
87
+ bytes: Buffer.byteLength(source.text),
88
+ sections: sections(source.text).found.map(({ id, title }) => ({ id, title })),
89
+ };
90
+ });
91
+ return { schemaVersion: 'openxiangda.documentation/v1', topics };
92
+ }
93
+ export function readDocumentation(id, section, root = documentationRoot()) {
94
+ const source = topicSource(id, root);
95
+ const parsed = sections(source.text);
96
+ const selected = section ? parsed.found.find(item => item.id === section) : undefined;
97
+ if (section && !selected)
98
+ throw new Error(`DOCUMENTATION_SECTION_NOT_FOUND: ${id} 没有章节 ${section},先读取该主题的章节目录`);
99
+ return {
100
+ schemaVersion: 'openxiangda.documentation/v1', topic: id, title: source.title,
101
+ version: source.version, sha256: source.sha256, uri: `openxiangda://docs/${id}`,
102
+ sections: parsed.found.map(({ id, title }) => ({ id, title })),
103
+ content: selected ? parsed.lines.slice(selected.start, selected.end).join('\n') : source.text,
104
+ };
105
+ }
106
+ export function workspaceGuidanceTemplatePath() {
107
+ return process.env.OPENXIANGDA_DOCUMENTATION_ROOT
108
+ ? resolve(documentationRoot(), 'AGENTS.md')
109
+ : resolve(import.meta.dirname, '../../../templates/application/AGENTS.md');
110
+ }
111
+ //# sourceMappingURL=documentation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documentation.js","sourceRoot":"","sources":["../src/documentation.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -18,4 +18,8 @@ export * from './version.js';
18
18
  export * from './toolchain-capsule.js';
19
19
  export * from './application-ui-contract.js';
20
20
  export * from './optional-backend.js';
21
+ export * from './developer-operations.js';
22
+ export * from './documentation.js';
23
+ export { developerError } from './developer-errors.js';
24
+ export { withWorkspaceOperation } from './workspace-operation.js';
21
25
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,iCAAiC,CAAC;AAChD,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AAEvC,cAAc,8BAA8B,CAAC;AAE7C,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,iCAAiC,CAAC;AAChD,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AAEvC,cAAc,8BAA8B,CAAC;AAE7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AAEnC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC"}
package/dist/index.js CHANGED
@@ -18,4 +18,8 @@ export * from './version.js';
18
18
  export * from './toolchain-capsule.js';
19
19
  export * from './application-ui-contract.js';
20
20
  export * from './optional-backend.js';
21
+ export * from './developer-operations.js';
22
+ export * from './documentation.js';
23
+ export { developerError } from './developer-errors.js';
24
+ export { withWorkspaceOperation } from './workspace-operation.js';
21
25
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,iCAAiC,CAAC;AAChD,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AAEvC,cAAc,8BAA8B,CAAC;AAE7C,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,iCAAiC,CAAC;AAChD,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AAEvC,cAAc,8BAA8B,CAAC;AAE7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AAEnC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** 本机工作区互斥;部署状态仍由平台持有。异常退出的锁由操作者确认进程退出后处理。 */
2
+ export declare function withWorkspaceOperation<T>(root: string | undefined, operation: string, execute: () => Promise<T>): Promise<T>;
3
+ //# sourceMappingURL=workspace-operation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-operation.d.ts","sourceRoot":"","sources":["../src/workspace-operation.ts"],"names":[],"mappings":"AAIA,8CAA8C;AAC9C,wBAAsB,sBAAsB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAwBlI"}
@@ -0,0 +1,45 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { closeSync, existsSync, mkdirSync, openSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
3
+ import { resolve } from 'node:path';
4
+ /** 本机工作区互斥;部署状态仍由平台持有。异常退出的锁由操作者确认进程退出后处理。 */
5
+ export async function withWorkspaceOperation(root, operation, execute) {
6
+ const directory = resolve(root || process.cwd(), '.openxiangda');
7
+ mkdirSync(directory, { recursive: true });
8
+ const path = resolve(directory, 'operation.lock');
9
+ const token = randomUUID();
10
+ let descriptor;
11
+ try {
12
+ descriptor = openSync(path, 'wx', 0o600);
13
+ }
14
+ catch (error) {
15
+ if (error.code === 'EEXIST') {
16
+ throw new Error(`WORKSPACE_OPERATION_BUSY: 工作区已有检查或部署持有 ${path};等待其完成。异常退出时先确认锁中进程已退出,再移除锁文件`);
17
+ }
18
+ throw error;
19
+ }
20
+ try {
21
+ writeFileSync(descriptor, JSON.stringify({ pid: process.pid, token, operation, startedAt: new Date().toISOString() }));
22
+ }
23
+ catch (error) {
24
+ unlinkSync(path);
25
+ throw error;
26
+ }
27
+ finally {
28
+ closeSync(descriptor);
29
+ }
30
+ try {
31
+ return await execute();
32
+ }
33
+ finally {
34
+ if (existsSync(path)) {
35
+ let owner;
36
+ try {
37
+ owner = JSON.parse(readFileSync(path, 'utf8'));
38
+ }
39
+ catch { /* 无法识别的锁不自动删除。 */ }
40
+ if (owner?.token === token)
41
+ unlinkSync(path);
42
+ }
43
+ }
44
+ }
45
+ //# sourceMappingURL=workspace-operation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-operation.js","sourceRoot":"","sources":["../src/workspace-operation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC9G,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,8CAA8C;AAC9C,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAI,IAAwB,EAAE,SAAiB,EAAE,OAAyB;IACpH,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;IACjE,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;IAC3B,IAAI,UAAkB,CAAC;IACvB,IAAI,CAAC;QAAC,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAAC,CAAC;IACjD,OAAO,KAAK,EAAE,CAAC;QACb,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,0CAA0C,IAAI,+BAA+B,CAAC,CAAC;QACjG,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;IAAC,CAAC;IAC/H,OAAO,KAAK,EAAE,CAAC;QAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAAC,MAAM,KAAK,CAAC;IAAC,CAAC;YACxC,CAAC;QAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAAC,CAAC;IAClC,IAAI,CAAC;QAAC,OAAO,MAAM,OAAO,EAAE,CAAC;IAAC,CAAC;YACvB,CAAC;QACP,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,IAAI,KAAqC,CAAC;YAC1C,IAAI,CAAC;gBAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;YACpF,IAAI,KAAK,EAAE,KAAK,KAAK,KAAK;gBAAE,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "openxiangda-devkit-core",
3
- "version": "2.0.0-alpha.113",
4
- "description": "Framework-neutral OpenXiangda 2.0 workspace and control-plane use cases.",
3
+ "version": "2.0.0-alpha.115",
4
+ "description": "OpenXiangda 2.0 的编译、开发、检查、部署与中文资料服务。",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
@@ -32,7 +32,7 @@
32
32
  "dependencies": {
33
33
  "ajv": "8.20.0",
34
34
  "cron-parser": "5.4.0",
35
- "openxiangda-contracts": "2.0.0-alpha.88",
35
+ "openxiangda-contracts": "2.0.0-alpha.90",
36
36
  "esbuild": "0.28.2",
37
37
  "typescript": "5.9.3",
38
38
  "undici": "6.28.0"