openxiangda-devkit-core 2.0.0-alpha.98 → 2.1.0
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/LICENSE +21 -0
- package/README.md +3 -9
- package/dist/app-spec.d.ts +30 -12
- package/dist/app-spec.d.ts.map +1 -1
- package/dist/app-spec.js +238 -57
- package/dist/app-spec.js.map +1 -1
- package/dist/application-services.d.ts +625 -42
- package/dist/application-services.d.ts.map +1 -1
- package/dist/application-services.js +322 -85
- package/dist/application-services.js.map +1 -1
- package/dist/application-ui-contract.d.ts +5 -0
- package/dist/application-ui-contract.d.ts.map +1 -0
- package/dist/application-ui-contract.js +149 -0
- package/dist/application-ui-contract.js.map +1 -0
- package/dist/backend-image-build.d.ts +6 -0
- package/dist/backend-image-build.d.ts.map +1 -1
- package/dist/backend-image-build.js +51 -11
- package/dist/backend-image-build.js.map +1 -1
- package/dist/backend-image-upload.d.ts +34 -0
- package/dist/backend-image-upload.d.ts.map +1 -0
- package/dist/backend-image-upload.js +118 -0
- package/dist/backend-image-upload.js.map +1 -0
- package/dist/command-process.d.ts +14 -0
- package/dist/command-process.d.ts.map +1 -0
- package/dist/command-process.js +51 -0
- package/dist/command-process.js.map +1 -0
- package/dist/command-registry.d.ts +44 -4
- package/dist/command-registry.d.ts.map +1 -1
- package/dist/command-registry.js +10 -6
- package/dist/command-registry.js.map +1 -1
- package/dist/compiler/ai-catalog.d.ts.map +1 -1
- package/dist/compiler/ai-catalog.js +2 -1
- package/dist/compiler/ai-catalog.js.map +1 -1
- package/dist/compiler/application-model.d.ts +60 -0
- package/dist/compiler/application-model.d.ts.map +1 -0
- package/dist/compiler/application-model.js +141 -0
- package/dist/compiler/application-model.js.map +1 -0
- package/dist/compiler/bundle.d.ts.map +1 -1
- package/dist/compiler/bundle.js +196 -98
- package/dist/compiler/bundle.js.map +1 -1
- package/dist/compiler/config.d.ts +36 -10
- package/dist/compiler/config.d.ts.map +1 -1
- package/dist/compiler/config.js +536 -171
- package/dist/compiler/config.js.map +1 -1
- package/dist/compiler/field-surface.js +1 -1
- package/dist/compiler/field-surface.js.map +1 -1
- package/dist/compiler/package-compiler.d.ts.map +1 -1
- package/dist/compiler/package-compiler.js +12 -0
- package/dist/compiler/package-compiler.js.map +1 -1
- package/dist/compiler/permission-review.d.ts +139 -0
- package/dist/compiler/permission-review.d.ts.map +1 -0
- package/dist/compiler/permission-review.js +131 -0
- package/dist/compiler/permission-review.js.map +1 -0
- package/dist/configuration-preflight.d.ts +7 -0
- package/dist/configuration-preflight.d.ts.map +1 -0
- package/dist/configuration-preflight.js +13 -0
- package/dist/configuration-preflight.js.map +1 -0
- package/dist/control-plane-client.d.ts +66 -61
- package/dist/control-plane-client.d.ts.map +1 -1
- package/dist/control-plane-client.js +99 -8
- package/dist/control-plane-client.js.map +1 -1
- package/dist/delivery-cache.d.ts +34 -0
- package/dist/delivery-cache.d.ts.map +1 -0
- package/dist/delivery-cache.js +186 -0
- package/dist/delivery-cache.js.map +1 -0
- package/dist/delivery-source.d.ts +17 -0
- package/dist/delivery-source.d.ts.map +1 -0
- package/dist/delivery-source.js +85 -0
- package/dist/delivery-source.js.map +1 -0
- package/dist/deployment-observer.d.ts +14 -0
- package/dist/deployment-observer.d.ts.map +1 -0
- package/dist/deployment-observer.js +68 -0
- package/dist/deployment-observer.js.map +1 -0
- package/dist/deployment.d.ts +17 -1
- package/dist/deployment.d.ts.map +1 -1
- package/dist/deployment.js +55 -15
- package/dist/deployment.js.map +1 -1
- package/dist/design-readiness.d.ts +24 -0
- package/dist/design-readiness.d.ts.map +1 -0
- package/dist/design-readiness.js +102 -0
- package/dist/design-readiness.js.map +1 -0
- package/dist/developer-errors.d.ts +11 -0
- package/dist/developer-errors.d.ts.map +1 -0
- package/dist/developer-errors.js +16 -0
- package/dist/developer-errors.js.map +1 -0
- package/dist/developer-operations.d.ts +190 -0
- package/dist/developer-operations.d.ts.map +1 -0
- package/dist/developer-operations.js +65 -0
- package/dist/developer-operations.js.map +1 -0
- package/dist/development-lifecycle.d.ts +75 -0
- package/dist/development-lifecycle.d.ts.map +1 -0
- package/dist/development-lifecycle.js +189 -0
- package/dist/development-lifecycle.js.map +1 -0
- package/dist/documentation.d.ts +111 -0
- package/dist/documentation.d.ts.map +1 -0
- package/dist/documentation.js +112 -0
- package/dist/documentation.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/operation-progress.d.ts +26 -0
- package/dist/operation-progress.d.ts.map +1 -0
- package/dist/operation-progress.js +92 -0
- package/dist/operation-progress.js.map +1 -0
- package/dist/optional-backend.d.ts +14 -0
- package/dist/optional-backend.d.ts.map +1 -0
- package/dist/optional-backend.js +145 -0
- package/dist/optional-backend.js.map +1 -0
- package/dist/session.d.ts +22 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +36 -0
- package/dist/session.js.map +1 -1
- package/dist/workspace-loader.d.ts.map +1 -1
- package/dist/workspace-loader.js +17 -2
- package/dist/workspace-loader.js.map +1 -1
- package/dist/workspace-operation.d.ts +3 -0
- package/dist/workspace-operation.d.ts.map +1 -0
- package/dist/workspace-operation.js +45 -0
- package/dist/workspace-operation.js.map +1 -0
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +1 -0
- package/dist/workspace.js.map +1 -1
- package/package.json +18 -4
- package/templates/backend/Dockerfile +20 -0
- package/templates/backend/package.json +27 -0
- package/templates/backend/src/app.module.ts +23 -0
- package/templates/backend/src/main.ts +5 -0
- package/templates/backend/tsconfig.json +9 -0
|
@@ -0,0 +1,111 @@
|
|
|
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: "product-design";
|
|
8
|
+
readonly title: "对话发现与详细产品设计";
|
|
9
|
+
readonly file: "product-design.md";
|
|
10
|
+
}, {
|
|
11
|
+
readonly id: "interaction-patterns";
|
|
12
|
+
readonly title: "页面交互模式与体验评审";
|
|
13
|
+
readonly file: "interaction-patterns.md";
|
|
14
|
+
}, {
|
|
15
|
+
readonly id: "development";
|
|
16
|
+
readonly title: "需求与开发流程";
|
|
17
|
+
readonly file: "development.md";
|
|
18
|
+
}, {
|
|
19
|
+
readonly id: "application-foundation";
|
|
20
|
+
readonly title: "业务模型与标准 CRUD";
|
|
21
|
+
readonly file: "application-foundation.md";
|
|
22
|
+
}, {
|
|
23
|
+
readonly id: "appspec";
|
|
24
|
+
readonly title: "需求、设计与交付记录";
|
|
25
|
+
readonly file: "appspec.md";
|
|
26
|
+
}, {
|
|
27
|
+
readonly id: "concepts";
|
|
28
|
+
readonly title: "架构与能力所有者";
|
|
29
|
+
readonly file: "concepts.md";
|
|
30
|
+
}, {
|
|
31
|
+
readonly id: "frontend";
|
|
32
|
+
readonly title: "页面与标准组件扩展";
|
|
33
|
+
readonly file: "frontend.md";
|
|
34
|
+
}, {
|
|
35
|
+
readonly id: "field-components";
|
|
36
|
+
readonly title: "字段、表单与移动控件";
|
|
37
|
+
readonly file: "field-components.md";
|
|
38
|
+
}, {
|
|
39
|
+
readonly id: "data-authz";
|
|
40
|
+
readonly title: "数据查询与权限";
|
|
41
|
+
readonly file: "data-authz.md";
|
|
42
|
+
}, {
|
|
43
|
+
readonly id: "public-access";
|
|
44
|
+
readonly title: "无账号的匿名公开访问";
|
|
45
|
+
readonly file: "public-access.md";
|
|
46
|
+
}, {
|
|
47
|
+
readonly id: "workflow-events";
|
|
48
|
+
readonly title: "审批、事件与通知";
|
|
49
|
+
readonly file: "workflow-events.md";
|
|
50
|
+
}, {
|
|
51
|
+
readonly id: "backend";
|
|
52
|
+
readonly title: "按需后端与业务动作";
|
|
53
|
+
readonly file: "backend.md";
|
|
54
|
+
}, {
|
|
55
|
+
readonly id: "administration";
|
|
56
|
+
readonly title: "应用管理与有效配置";
|
|
57
|
+
readonly file: "administration.md";
|
|
58
|
+
}, {
|
|
59
|
+
readonly id: "testing";
|
|
60
|
+
readonly title: "检查与真实业务验收";
|
|
61
|
+
readonly file: "testing.md";
|
|
62
|
+
}, {
|
|
63
|
+
readonly id: "delivery";
|
|
64
|
+
readonly title: "部署、生产晋级与恢复";
|
|
65
|
+
readonly file: "delivery.md";
|
|
66
|
+
}, {
|
|
67
|
+
readonly id: "upgrading";
|
|
68
|
+
readonly title: "版本升级与资料刷新";
|
|
69
|
+
readonly file: "upgrading.md";
|
|
70
|
+
}, {
|
|
71
|
+
readonly id: "cli";
|
|
72
|
+
readonly title: "CLI 命令参考";
|
|
73
|
+
readonly file: "reference/cli.md";
|
|
74
|
+
}, {
|
|
75
|
+
readonly id: "mcp";
|
|
76
|
+
readonly title: "MCP 配置与工具参考";
|
|
77
|
+
readonly file: "reference/mcp.md";
|
|
78
|
+
}];
|
|
79
|
+
/** Skill 参考文件名直接使用主题 ID,正文由同一中文主题生成。 */
|
|
80
|
+
export declare function documentationReferenceFile(id: string): string;
|
|
81
|
+
export declare function documentationRoot(): string;
|
|
82
|
+
export declare function documentationIndex(root?: string): {
|
|
83
|
+
schemaVersion: string;
|
|
84
|
+
topics: {
|
|
85
|
+
id: "appspec" | "delivery" | "frontend" | "backend" | "getting-started" | "product-design" | "interaction-patterns" | "development" | "application-foundation" | "concepts" | "field-components" | "data-authz" | "public-access" | "workflow-events" | "administration" | "testing" | "upgrading" | "cli" | "mcp";
|
|
86
|
+
title: "CLI 命令参考" | "安装与开始开发" | "对话发现与详细产品设计" | "页面交互模式与体验评审" | "需求与开发流程" | "业务模型与标准 CRUD" | "需求、设计与交付记录" | "架构与能力所有者" | "页面与标准组件扩展" | "字段、表单与移动控件" | "数据查询与权限" | "无账号的匿名公开访问" | "审批、事件与通知" | "按需后端与业务动作" | "应用管理与有效配置" | "检查与真实业务验收" | "部署、生产晋级与恢复" | "版本升级与资料刷新" | "MCP 配置与工具参考";
|
|
87
|
+
uri: string;
|
|
88
|
+
version: string;
|
|
89
|
+
sha256: string;
|
|
90
|
+
bytes: number;
|
|
91
|
+
sections: {
|
|
92
|
+
id: string;
|
|
93
|
+
title: string;
|
|
94
|
+
}[];
|
|
95
|
+
}[];
|
|
96
|
+
};
|
|
97
|
+
export declare function readDocumentation(id: string, section?: string, root?: string): {
|
|
98
|
+
schemaVersion: string;
|
|
99
|
+
topic: string;
|
|
100
|
+
title: "CLI 命令参考" | "安装与开始开发" | "对话发现与详细产品设计" | "页面交互模式与体验评审" | "需求与开发流程" | "业务模型与标准 CRUD" | "需求、设计与交付记录" | "架构与能力所有者" | "页面与标准组件扩展" | "字段、表单与移动控件" | "数据查询与权限" | "无账号的匿名公开访问" | "审批、事件与通知" | "按需后端与业务动作" | "应用管理与有效配置" | "检查与真实业务验收" | "部署、生产晋级与恢复" | "版本升级与资料刷新" | "MCP 配置与工具参考";
|
|
101
|
+
version: string;
|
|
102
|
+
sha256: string;
|
|
103
|
+
uri: string;
|
|
104
|
+
sections: {
|
|
105
|
+
id: string;
|
|
106
|
+
title: string;
|
|
107
|
+
}[];
|
|
108
|
+
content: string;
|
|
109
|
+
};
|
|
110
|
+
export declare function workspaceGuidanceTemplatePath(): string;
|
|
111
|
+
//# 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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoBvB,CAAC;AAEX,wCAAwC;AACxC,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,MAAM,UAEpD;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,112 @@
|
|
|
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: 'product-design', title: '对话发现与详细产品设计', file: 'product-design.md' },
|
|
8
|
+
{ id: 'interaction-patterns', title: '页面交互模式与体验评审', file: 'interaction-patterns.md' },
|
|
9
|
+
{ id: 'development', title: '需求与开发流程', file: 'development.md' },
|
|
10
|
+
{ id: 'application-foundation', title: '业务模型与标准 CRUD', file: 'application-foundation.md' },
|
|
11
|
+
{ id: 'appspec', title: '需求、设计与交付记录', file: 'appspec.md' },
|
|
12
|
+
{ id: 'concepts', title: '架构与能力所有者', file: 'concepts.md' },
|
|
13
|
+
{ id: 'frontend', title: '页面与标准组件扩展', file: 'frontend.md' },
|
|
14
|
+
{ id: 'field-components', title: '字段、表单与移动控件', file: 'field-components.md' },
|
|
15
|
+
{ id: 'data-authz', title: '数据查询与权限', file: 'data-authz.md' },
|
|
16
|
+
{ id: 'public-access', title: '无账号的匿名公开访问', file: 'public-access.md' },
|
|
17
|
+
{ id: 'workflow-events', title: '审批、事件与通知', file: 'workflow-events.md' },
|
|
18
|
+
{ id: 'backend', title: '按需后端与业务动作', file: 'backend.md' },
|
|
19
|
+
{ id: 'administration', title: '应用管理与有效配置', file: 'administration.md' },
|
|
20
|
+
{ id: 'testing', title: '检查与真实业务验收', file: 'testing.md' },
|
|
21
|
+
{ id: 'delivery', title: '部署、生产晋级与恢复', file: 'delivery.md' },
|
|
22
|
+
{ id: 'upgrading', title: '版本升级与资料刷新', file: 'upgrading.md' },
|
|
23
|
+
{ id: 'cli', title: 'CLI 命令参考', file: 'reference/cli.md' },
|
|
24
|
+
{ id: 'mcp', title: 'MCP 配置与工具参考', file: 'reference/mcp.md' },
|
|
25
|
+
];
|
|
26
|
+
/** Skill 参考文件名直接使用主题 ID,正文由同一中文主题生成。 */
|
|
27
|
+
export function documentationReferenceFile(id) {
|
|
28
|
+
return `${id}.md`;
|
|
29
|
+
}
|
|
30
|
+
const MAX_TOPIC_BYTES = 128 * 1024;
|
|
31
|
+
export function documentationRoot() {
|
|
32
|
+
return resolve(process.env.OPENXIANGDA_DOCUMENTATION_ROOT || resolve(import.meta.dirname, '../../../docs'));
|
|
33
|
+
}
|
|
34
|
+
function topicSource(id, root) {
|
|
35
|
+
const topic = DOCUMENTATION_TOPICS.find(item => item.id === id);
|
|
36
|
+
if (!topic)
|
|
37
|
+
throw new Error(`DOCUMENTATION_TOPIC_NOT_FOUND: 未知主题 ${id}。CLI 运行 pnpm openxiangda docs,MCP 调用 docs_read 并省略 topic,按目录中的 id 读取正文`);
|
|
38
|
+
const path = resolve(root, topic.file);
|
|
39
|
+
if (!existsSync(path))
|
|
40
|
+
throw new Error(`DOCUMENTATION_NOT_INSTALLED: 当前安装缺少 ${id},请通过同版本 openxiangda 根包启动`);
|
|
41
|
+
const resolved = realpathSync(path);
|
|
42
|
+
const local = relative(realpathSync(root), resolved);
|
|
43
|
+
if (local.startsWith('..') || isAbsolute(local))
|
|
44
|
+
throw new Error('DOCUMENTATION_PATH_FORBIDDEN: 文档不能越过资料目录');
|
|
45
|
+
if (!statSync(resolved).isFile() || statSync(resolved).size > MAX_TOPIC_BYTES) {
|
|
46
|
+
throw new Error('DOCUMENTATION_SIZE_EXCEEDED: 单个主题必须是大小不超过 128 KiB 的文本文档');
|
|
47
|
+
}
|
|
48
|
+
const text = readFileSync(resolved, 'utf8');
|
|
49
|
+
const sha256 = createHash('sha256').update(text).digest('hex');
|
|
50
|
+
const manifestPath = resolve(root, 'manifest.json');
|
|
51
|
+
const manifest = existsSync(manifestPath)
|
|
52
|
+
? JSON.parse(readFileSync(manifestPath, 'utf8'))
|
|
53
|
+
: undefined;
|
|
54
|
+
if (manifest && manifest.topics.find(item => item.id === id)?.sha256 !== sha256) {
|
|
55
|
+
throw new Error(`DOCUMENTATION_DIGEST_MISMATCH: ${id} 与当前根包资料摘要不一致,请重新安装该精确版本`);
|
|
56
|
+
}
|
|
57
|
+
return { ...topic, text, sha256, version: manifest?.version || 'development' };
|
|
58
|
+
}
|
|
59
|
+
function sections(text) {
|
|
60
|
+
const lines = text.split('\n');
|
|
61
|
+
const found = [];
|
|
62
|
+
let fenced = false;
|
|
63
|
+
const used = new Map();
|
|
64
|
+
lines.forEach((line, index) => {
|
|
65
|
+
if (/^\s*(```|~~~)/.test(line)) {
|
|
66
|
+
fenced = !fenced;
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const match = !fenced && line.match(/^##\s+(.+?)(?:\s+\{#([\w-]+)\})?\s*$/);
|
|
70
|
+
if (!match)
|
|
71
|
+
return;
|
|
72
|
+
const title = match[1];
|
|
73
|
+
const base = match[2] || title.toLowerCase().replace(/[^\p{L}\p{N}]+/gu, '-').replace(/^-|-$/g, '');
|
|
74
|
+
const count = used.get(base) || 0;
|
|
75
|
+
used.set(base, count + 1);
|
|
76
|
+
if (found.length)
|
|
77
|
+
found[found.length - 1].end = index;
|
|
78
|
+
found.push({ id: count ? `${base}-${count + 1}` : base, title, start: index, end: lines.length });
|
|
79
|
+
});
|
|
80
|
+
return { lines, found };
|
|
81
|
+
}
|
|
82
|
+
export function documentationIndex(root = documentationRoot()) {
|
|
83
|
+
const topics = DOCUMENTATION_TOPICS.map(({ id }) => {
|
|
84
|
+
const source = topicSource(id, root);
|
|
85
|
+
return {
|
|
86
|
+
id, title: source.title, uri: `openxiangda://docs/${id}`,
|
|
87
|
+
version: source.version, sha256: source.sha256,
|
|
88
|
+
bytes: Buffer.byteLength(source.text),
|
|
89
|
+
sections: sections(source.text).found.map(({ id, title }) => ({ id, title })),
|
|
90
|
+
};
|
|
91
|
+
});
|
|
92
|
+
return { schemaVersion: 'openxiangda.documentation/v1', topics };
|
|
93
|
+
}
|
|
94
|
+
export function readDocumentation(id, section, root = documentationRoot()) {
|
|
95
|
+
const source = topicSource(id, root);
|
|
96
|
+
const parsed = sections(source.text);
|
|
97
|
+
const selected = section ? parsed.found.find(item => item.id === section) : undefined;
|
|
98
|
+
if (section && !selected)
|
|
99
|
+
throw new Error(`DOCUMENTATION_SECTION_NOT_FOUND: ${id} 没有章节 ${section},先读取该主题的章节目录`);
|
|
100
|
+
return {
|
|
101
|
+
schemaVersion: 'openxiangda.documentation/v1', topic: id, title: source.title,
|
|
102
|
+
version: source.version, sha256: source.sha256, uri: `openxiangda://docs/${id}`,
|
|
103
|
+
sections: parsed.found.map(({ id, title }) => ({ id, title })),
|
|
104
|
+
content: selected ? parsed.lines.slice(selected.start, selected.end).join('\n') : source.text,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
export function workspaceGuidanceTemplatePath() {
|
|
108
|
+
return process.env.OPENXIANGDA_DOCUMENTATION_ROOT
|
|
109
|
+
? resolve(documentationRoot(), 'AGENTS.md')
|
|
110
|
+
: resolve(import.meta.dirname, '../../../templates/application/AGENTS.md');
|
|
111
|
+
}
|
|
112
|
+
//# 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
|
@@ -2,6 +2,7 @@ export * from './application-services.js';
|
|
|
2
2
|
export * from './app-spec.js';
|
|
3
3
|
export * from './connected-development.js';
|
|
4
4
|
export * from './compiler/bundle.js';
|
|
5
|
+
export * from './compiler/permission-review.js';
|
|
5
6
|
export * from './command-registry.js';
|
|
6
7
|
export * from './config.js';
|
|
7
8
|
export * from './control-plane-client.js';
|
|
@@ -9,9 +10,18 @@ export * from './deployment.js';
|
|
|
9
10
|
export * from './package-compiler.js';
|
|
10
11
|
export * from './compiler/ai-catalog.js';
|
|
11
12
|
export * from './compiler/schema-composition.js';
|
|
13
|
+
export * from './compiler/application-model.js';
|
|
12
14
|
export * from './workspace.js';
|
|
13
15
|
export * from './workspace-loader.js';
|
|
14
16
|
export * from './session.js';
|
|
15
17
|
export * from './version.js';
|
|
16
18
|
export * from './toolchain-capsule.js';
|
|
19
|
+
export * from './application-ui-contract.js';
|
|
20
|
+
export * from './optional-backend.js';
|
|
21
|
+
export * from './developer-operations.js';
|
|
22
|
+
export * from './operation-progress.js';
|
|
23
|
+
export * from './deployment-observer.js';
|
|
24
|
+
export * from './documentation.js';
|
|
25
|
+
export { developerError } from './developer-errors.js';
|
|
26
|
+
export { withWorkspaceOperation } from './workspace-operation.js';
|
|
17
27
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,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,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,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,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AAEnC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,7 @@ export * from './application-services.js';
|
|
|
2
2
|
export * from './app-spec.js';
|
|
3
3
|
export * from './connected-development.js';
|
|
4
4
|
export * from './compiler/bundle.js';
|
|
5
|
+
export * from './compiler/permission-review.js';
|
|
5
6
|
export * from './command-registry.js';
|
|
6
7
|
export * from './config.js';
|
|
7
8
|
export * from './control-plane-client.js';
|
|
@@ -9,9 +10,18 @@ export * from './deployment.js';
|
|
|
9
10
|
export * from './package-compiler.js';
|
|
10
11
|
export * from './compiler/ai-catalog.js';
|
|
11
12
|
export * from './compiler/schema-composition.js';
|
|
13
|
+
export * from './compiler/application-model.js';
|
|
12
14
|
export * from './workspace.js';
|
|
13
15
|
export * from './workspace-loader.js';
|
|
14
16
|
export * from './session.js';
|
|
15
17
|
export * from './version.js';
|
|
16
18
|
export * from './toolchain-capsule.js';
|
|
19
|
+
export * from './application-ui-contract.js';
|
|
20
|
+
export * from './optional-backend.js';
|
|
21
|
+
export * from './developer-operations.js';
|
|
22
|
+
export * from './operation-progress.js';
|
|
23
|
+
export * from './deployment-observer.js';
|
|
24
|
+
export * from './documentation.js';
|
|
25
|
+
export { developerError } from './developer-errors.js';
|
|
26
|
+
export { withWorkspaceOperation } from './workspace-operation.js';
|
|
17
27
|
//# 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,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,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,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,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AAEnC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface OperationStage {
|
|
2
|
+
stage: string;
|
|
3
|
+
label: string;
|
|
4
|
+
state: 'running' | 'passed' | 'failed' | 'skipped';
|
|
5
|
+
startedAt: string;
|
|
6
|
+
durationMs: number;
|
|
7
|
+
details?: Record<string, unknown>;
|
|
8
|
+
}
|
|
9
|
+
export interface OperationProgress extends OperationStage {
|
|
10
|
+
schemaVersion: 'openxiangda.operation-progress/v1';
|
|
11
|
+
operationId: string;
|
|
12
|
+
operation: string;
|
|
13
|
+
sequence: number;
|
|
14
|
+
elapsedMs: number;
|
|
15
|
+
heartbeat: boolean;
|
|
16
|
+
}
|
|
17
|
+
export type OperationProgressListener = (event: OperationProgress) => void | Promise<void>;
|
|
18
|
+
/** 每次调用独立;并发 MCP 请求不会共享当前阶段或监听器。 */
|
|
19
|
+
export declare function withOperationProgress<T extends {
|
|
20
|
+
data?: unknown;
|
|
21
|
+
}>(operation: string, listener: OperationProgressListener | undefined, execute: () => Promise<T>, heartbeatMs?: number): Promise<T>;
|
|
22
|
+
export declare function operationStage<T>(stage: string, label: string, execute: () => Promise<T>): Promise<T>;
|
|
23
|
+
export declare function skippedOperationStage(stage: string, label: string): void;
|
|
24
|
+
/** 平台仍是运行状态权威;此处只刷新本次观察的标题和运行指针。 */
|
|
25
|
+
export declare function updateOperationStage(stage: string, label: string, details: Record<string, unknown>): void;
|
|
26
|
+
//# sourceMappingURL=operation-progress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-progress.d.ts","sourceRoot":"","sources":["../src/operation-progress.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AACD,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,aAAa,EAAE,mCAAmC,CAAC;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB;AACD,MAAM,MAAM,yBAAyB,GAAG,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAY3F,oCAAoC;AACpC,wBAAsB,qBAAqB,CAAC,CAAC,SAAS;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,EACtE,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,yBAAyB,GAAG,SAAS,EAC/C,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACzB,WAAW,SAAS,GACnB,OAAO,CAAC,CAAC,CAAC,CAuBZ;AAYD,wBAAsB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAwB3G;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAKjE;AAED,oCAAoC;AACpC,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAQlG"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
const storage = new AsyncLocalStorage();
|
|
4
|
+
/** 每次调用独立;并发 MCP 请求不会共享当前阶段或监听器。 */
|
|
5
|
+
export async function withOperationProgress(operation, listener, execute, heartbeatMs = 10_000) {
|
|
6
|
+
const context = {
|
|
7
|
+
operationId: randomUUID(), operation, started: Date.now(), sequence: 0,
|
|
8
|
+
stages: [], heartbeatMs, ...(listener ? { listener } : {}),
|
|
9
|
+
};
|
|
10
|
+
return storage.run(context, async () => {
|
|
11
|
+
const execution = () => ({
|
|
12
|
+
operationId: context.operationId,
|
|
13
|
+
elapsedMs: Date.now() - context.started,
|
|
14
|
+
stages: context.stages.map(stage => ({ ...stage })),
|
|
15
|
+
});
|
|
16
|
+
try {
|
|
17
|
+
const result = await execute();
|
|
18
|
+
const data = result.data && typeof result.data === 'object' ? result.data : {};
|
|
19
|
+
return { ...result, data: { ...data, execution: execution() } };
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
if (error && typeof error === 'object') {
|
|
23
|
+
const value = error;
|
|
24
|
+
try {
|
|
25
|
+
value.data = { ...value.data, execution: execution() };
|
|
26
|
+
}
|
|
27
|
+
catch { /* 保留不可扩展的原始异常。 */ }
|
|
28
|
+
}
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
function emit(context, stage, heartbeat = false) {
|
|
34
|
+
const event = {
|
|
35
|
+
...stage, schemaVersion: 'openxiangda.operation-progress/v1',
|
|
36
|
+
operationId: context.operationId, operation: context.operation,
|
|
37
|
+
sequence: ++context.sequence, elapsedMs: Date.now() - context.started, heartbeat,
|
|
38
|
+
};
|
|
39
|
+
// 可观测性传输失败不能改变已提交操作的结果;最终结果仍带阶段摘要。
|
|
40
|
+
try {
|
|
41
|
+
void Promise.resolve(context.listener?.(event)).catch(() => undefined);
|
|
42
|
+
}
|
|
43
|
+
catch { /* 观察者不能改变执行。 */ }
|
|
44
|
+
}
|
|
45
|
+
export async function operationStage(stage, label, execute) {
|
|
46
|
+
const context = storage.getStore();
|
|
47
|
+
if (!context)
|
|
48
|
+
return execute();
|
|
49
|
+
const started = Date.now();
|
|
50
|
+
const record = { stage, label, state: 'running', startedAt: new Date(started).toISOString(), durationMs: 0 };
|
|
51
|
+
context.stages.push(record);
|
|
52
|
+
emit(context, record);
|
|
53
|
+
const heartbeat = setInterval(() => {
|
|
54
|
+
record.durationMs = Date.now() - started;
|
|
55
|
+
emit(context, record, true);
|
|
56
|
+
}, context.heartbeatMs);
|
|
57
|
+
heartbeat.unref();
|
|
58
|
+
try {
|
|
59
|
+
const result = await execute();
|
|
60
|
+
record.state = result && typeof result === 'object' && 'ok' in result && result.ok === false ? 'failed' : 'passed';
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
record.state = 'failed';
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
clearInterval(heartbeat);
|
|
69
|
+
record.durationMs = Date.now() - started;
|
|
70
|
+
emit(context, record);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export function skippedOperationStage(stage, label) {
|
|
74
|
+
const context = storage.getStore();
|
|
75
|
+
if (!context)
|
|
76
|
+
return;
|
|
77
|
+
const record = { stage, label, state: 'skipped', startedAt: new Date().toISOString(), durationMs: 0 };
|
|
78
|
+
context.stages.push(record);
|
|
79
|
+
emit(context, record);
|
|
80
|
+
}
|
|
81
|
+
/** 平台仍是运行状态权威;此处只刷新本次观察的标题和运行指针。 */
|
|
82
|
+
export function updateOperationStage(stage, label, details) {
|
|
83
|
+
const context = storage.getStore();
|
|
84
|
+
const record = context?.stages.slice().reverse().find(item => item.stage === stage && item.state === 'running');
|
|
85
|
+
if (!context || !record)
|
|
86
|
+
return;
|
|
87
|
+
record.label = label;
|
|
88
|
+
record.details = details;
|
|
89
|
+
record.durationMs = Date.now() - Date.parse(record.startedAt);
|
|
90
|
+
emit(context, record);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=operation-progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-progress.js","sourceRoot":"","sources":["../src/operation-progress.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type OpenXiangdaAppConfig } from './compiler/config.js';
|
|
2
|
+
export interface OptionalBackendInitialization {
|
|
3
|
+
required: boolean;
|
|
4
|
+
created: boolean;
|
|
5
|
+
installed: boolean;
|
|
6
|
+
root: string;
|
|
7
|
+
}
|
|
8
|
+
/** Initialize user-owned source only when the application declares server execution. */
|
|
9
|
+
export declare function initializeOptionalBackend(workspaceRoot: string, config: OpenXiangdaAppConfig, options?: {
|
|
10
|
+
sdkVersion?: string;
|
|
11
|
+
/** Package manager boundary, injectable by deterministic toolchain tests. */
|
|
12
|
+
install?: (root: string) => void;
|
|
13
|
+
}): OptionalBackendInitialization;
|
|
14
|
+
//# sourceMappingURL=optional-backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optional-backend.d.ts","sourceRoot":"","sources":["../src/optional-backend.ts"],"names":[],"mappings":"AAOA,OAAO,EAA0B,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEzF,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wFAAwF;AACxF,wBAAgB,yBAAyB,CACvC,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,oBAAoB,EAC5B,OAAO,GAAE;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B,GACL,6BAA6B,CAwE/B"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import { closeSync, cpSync, existsSync, lstatSync, mkdirSync, mkdtempSync, openSync, readFileSync, renameSync, rmSync, writeFileSync, } from 'node:fs';
|
|
3
|
+
import { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { backendRuntimeRequired } from './compiler/config.js';
|
|
6
|
+
/** Initialize user-owned source only when the application declares server execution. */
|
|
7
|
+
export function initializeOptionalBackend(workspaceRoot, config, options = {}) {
|
|
8
|
+
const root = resolve(workspaceRoot);
|
|
9
|
+
const required = backendRuntimeRequired(config);
|
|
10
|
+
const result = { required, created: false, installed: false, root: config.backend.root };
|
|
11
|
+
if (!required)
|
|
12
|
+
return result;
|
|
13
|
+
const target = resolve(root, config.backend.root);
|
|
14
|
+
assertContainedPath(root, target);
|
|
15
|
+
const receiptRoot = join(root, '.openxiangda');
|
|
16
|
+
assertContainedPath(root, receiptRoot);
|
|
17
|
+
const receipt = join(receiptRoot, 'backend-install-pending.json');
|
|
18
|
+
assertContainedPath(root, receipt);
|
|
19
|
+
// Existing authored backends belong to the app; no regeneration or reinstall.
|
|
20
|
+
if (existsSync(target) && !existsSync(receipt))
|
|
21
|
+
return result;
|
|
22
|
+
mkdirSync(receiptRoot, { recursive: true });
|
|
23
|
+
const lock = join(receiptRoot, 'backend-initialization.lock');
|
|
24
|
+
assertContainedPath(root, lock);
|
|
25
|
+
const lockFd = acquireInitializationLock(lock);
|
|
26
|
+
let staging;
|
|
27
|
+
try {
|
|
28
|
+
assertContainedPath(root, target);
|
|
29
|
+
if (!existsSync(target)) {
|
|
30
|
+
const sdkVersion = options.sdkVersion || workspaceSdkVersion(root);
|
|
31
|
+
if (!sdkVersion || !/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(sdkVersion)) {
|
|
32
|
+
throw initializationError('OPENXIANGDA_BACKEND_SDK_VERSION_REQUIRED', '按需后端需要工作区精确版本的 openxiangda 依赖');
|
|
33
|
+
}
|
|
34
|
+
const source = fileURLToPath(new URL('../templates/backend/', import.meta.url));
|
|
35
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
36
|
+
staging = mkdtempSync(join(dirname(target), '.openxiangda-backend-'));
|
|
37
|
+
cpSync(source, staging, {
|
|
38
|
+
recursive: true,
|
|
39
|
+
filter: path => !/(?:^|\/)(?:node_modules|dist)(?:\/|$)/.test(relative(source, path)),
|
|
40
|
+
});
|
|
41
|
+
const manifestPath = join(staging, 'package.json');
|
|
42
|
+
const manifest = JSON.parse(readFileSync(manifestPath, 'utf8'));
|
|
43
|
+
manifest.dependencies.openxiangda = sdkVersion;
|
|
44
|
+
writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
|
|
45
|
+
const tsconfigPath = join(staging, 'tsconfig.json');
|
|
46
|
+
const tsconfig = JSON.parse(readFileSync(tsconfigPath, 'utf8'));
|
|
47
|
+
tsconfig.extends = relative(target, join(root, 'tsconfig.base.json')).split(sep).join('/');
|
|
48
|
+
writeFileSync(tsconfigPath, `${JSON.stringify(tsconfig, null, 2)}\n`);
|
|
49
|
+
const dockerfilePath = join(staging, 'Dockerfile');
|
|
50
|
+
writeFileSync(dockerfilePath, readFileSync(dockerfilePath, 'utf8')
|
|
51
|
+
.replaceAll('apps/server', relative(root, target).split(sep).join('/')));
|
|
52
|
+
// Write the retry receipt before committing source so interrupted setup is resumable.
|
|
53
|
+
if (!existsSync(receipt)) {
|
|
54
|
+
writeFileSync(receipt, `${JSON.stringify({ root: config.backend.root })}\n`, { flag: 'wx' });
|
|
55
|
+
}
|
|
56
|
+
else if (JSON.parse(readFileSync(receipt, 'utf8')).root !== config.backend.root) {
|
|
57
|
+
throw initializationError('OPENXIANGDA_BACKEND_INITIALIZATION_CONFLICT', '未完成的后端初始化与当前声明不一致');
|
|
58
|
+
}
|
|
59
|
+
if (existsSync(target))
|
|
60
|
+
throw initializationError('OPENXIANGDA_BACKEND_SOURCE_CONFLICT', '后端目录已由另一操作创建,未覆盖其内容');
|
|
61
|
+
renameSync(staging, target);
|
|
62
|
+
staging = undefined;
|
|
63
|
+
result.created = true;
|
|
64
|
+
}
|
|
65
|
+
if (existsSync(receipt)) {
|
|
66
|
+
const pending = JSON.parse(readFileSync(receipt, 'utf8'));
|
|
67
|
+
if (pending.root !== config.backend.root || !existsSync(join(target, 'package.json'))) {
|
|
68
|
+
throw initializationError('OPENXIANGDA_BACKEND_INITIALIZATION_CONFLICT', '未完成的后端初始化与当前声明不一致;请检查 .openxiangda/backend-install-pending.json');
|
|
69
|
+
}
|
|
70
|
+
(options.install || installBackendDependencies)(root);
|
|
71
|
+
rmSync(receipt);
|
|
72
|
+
result.installed = true;
|
|
73
|
+
}
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
if (staging)
|
|
78
|
+
rmSync(staging, { recursive: true, force: true });
|
|
79
|
+
closeSync(lockFd);
|
|
80
|
+
rmSync(lock, { force: true });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function acquireInitializationLock(path) {
|
|
84
|
+
for (let attempt = 0; attempt < 2; attempt += 1) {
|
|
85
|
+
try {
|
|
86
|
+
const fd = openSync(path, 'wx');
|
|
87
|
+
writeFileSync(fd, String(process.pid));
|
|
88
|
+
return fd;
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
if (error.code !== 'EEXIST')
|
|
92
|
+
throw error;
|
|
93
|
+
const owner = readFileSync(path, 'utf8');
|
|
94
|
+
const pid = Number(owner);
|
|
95
|
+
if (Number.isSafeInteger(pid) && pid > 0 && pid <= 2147483647) {
|
|
96
|
+
try {
|
|
97
|
+
process.kill(pid, 0);
|
|
98
|
+
}
|
|
99
|
+
catch (probe) {
|
|
100
|
+
if (probe.code === 'ESRCH' && readFileSync(path, 'utf8') === owner) {
|
|
101
|
+
rmSync(path);
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
throw initializationError('OPENXIANGDA_BACKEND_INITIALIZATION_BUSY', '另一进程正在初始化后端;待其完成后重试', true);
|
|
110
|
+
}
|
|
111
|
+
function workspaceSdkVersion(root) {
|
|
112
|
+
const manifest = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8'));
|
|
113
|
+
return manifest.devDependencies?.openxiangda || manifest.dependencies?.openxiangda;
|
|
114
|
+
}
|
|
115
|
+
function installBackendDependencies(root) {
|
|
116
|
+
const installed = spawnSync('pnpm', ['install', '--no-frozen-lockfile', '--ignore-scripts'], {
|
|
117
|
+
cwd: root, encoding: 'utf8', timeout: 180_000, maxBuffer: 4 * 1024 * 1024,
|
|
118
|
+
});
|
|
119
|
+
if (installed.status !== 0 || installed.error) {
|
|
120
|
+
throw initializationError('OPENXIANGDA_BACKEND_INSTALL_FAILED', '后端源码已保留,依赖安装未完成;检查包管理器/网络后重新运行 openxiangda check 或 dev', true);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function assertContainedPath(root, target) {
|
|
124
|
+
const name = relative(root, target);
|
|
125
|
+
if (!name || name.startsWith(`..${sep}`) || name === '..' || isAbsolute(name)) {
|
|
126
|
+
throw initializationError('OPENXIANGDA_BACKEND_PATH_INVALID', '后端目录必须位于当前工作区内');
|
|
127
|
+
}
|
|
128
|
+
let current = root;
|
|
129
|
+
for (const part of name.split(sep)) {
|
|
130
|
+
current = join(current, part);
|
|
131
|
+
try {
|
|
132
|
+
if (lstatSync(current).isSymbolicLink()) {
|
|
133
|
+
throw initializationError('OPENXIANGDA_BACKEND_PATH_INVALID', '后端目录不能穿过符号链接');
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
if (error.code !== 'ENOENT')
|
|
138
|
+
throw error;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
function initializationError(code, message, retryable = false) {
|
|
143
|
+
return Object.assign(new Error(`${code}: ${message}`), { code, retryable });
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=optional-backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optional-backend.js","sourceRoot":"","sources":["../src/optional-backend.ts"],"names":[],"mappings":"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"}
|