openxiangda-cli 2.0.0-alpha.100

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.
Files changed (98) hide show
  1. package/README.md +13 -0
  2. package/bin/run.js +92 -0
  3. package/dist/base.d.ts +44 -0
  4. package/dist/base.d.ts.map +1 -0
  5. package/dist/base.js +119 -0
  6. package/dist/base.js.map +1 -0
  7. package/dist/commands/accept.d.ts +23 -0
  8. package/dist/commands/accept.d.ts.map +1 -0
  9. package/dist/commands/accept.js +21 -0
  10. package/dist/commands/accept.js.map +1 -0
  11. package/dist/commands/check.d.ts +22 -0
  12. package/dist/commands/check.d.ts.map +1 -0
  13. package/dist/commands/check.js +7 -0
  14. package/dist/commands/check.js.map +1 -0
  15. package/dist/commands/create.d.ts +23 -0
  16. package/dist/commands/create.d.ts.map +1 -0
  17. package/dist/commands/create.js +101 -0
  18. package/dist/commands/create.js.map +1 -0
  19. package/dist/commands/deploy.d.ts +26 -0
  20. package/dist/commands/deploy.d.ts.map +1 -0
  21. package/dist/commands/deploy.js +42 -0
  22. package/dist/commands/deploy.js.map +1 -0
  23. package/dist/commands/dev.d.ts +24 -0
  24. package/dist/commands/dev.d.ts.map +1 -0
  25. package/dist/commands/dev.js +28 -0
  26. package/dist/commands/dev.js.map +1 -0
  27. package/dist/commands/login.d.ts +24 -0
  28. package/dist/commands/login.d.ts.map +1 -0
  29. package/dist/commands/login.js +73 -0
  30. package/dist/commands/login.js.map +1 -0
  31. package/dist/commands/logs.d.ts +25 -0
  32. package/dist/commands/logs.d.ts.map +1 -0
  33. package/dist/commands/logs.js +9 -0
  34. package/dist/commands/logs.js.map +1 -0
  35. package/dist/commands/rollback.d.ts +24 -0
  36. package/dist/commands/rollback.d.ts.map +1 -0
  37. package/dist/commands/rollback.js +16 -0
  38. package/dist/commands/rollback.js.map +1 -0
  39. package/dist/commands/skill.d.ts +26 -0
  40. package/dist/commands/skill.d.ts.map +1 -0
  41. package/dist/commands/skill.js +43 -0
  42. package/dist/commands/skill.js.map +1 -0
  43. package/dist/commands/status.d.ts +25 -0
  44. package/dist/commands/status.d.ts.map +1 -0
  45. package/dist/commands/status.js +9 -0
  46. package/dist/commands/status.js.map +1 -0
  47. package/dist/create-workspace.d.ts +31 -0
  48. package/dist/create-workspace.d.ts.map +1 -0
  49. package/dist/create-workspace.js +273 -0
  50. package/dist/create-workspace.js.map +1 -0
  51. package/dist/index.d.ts +3 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +3 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/toolchain-capsule.d.ts +4 -0
  56. package/dist/toolchain-capsule.d.ts.map +1 -0
  57. package/dist/toolchain-capsule.js +116 -0
  58. package/dist/toolchain-capsule.js.map +1 -0
  59. package/package.json +49 -0
  60. package/template/.dockerignore +23 -0
  61. package/template/.env.example +3 -0
  62. package/template/AGENTS.md +22 -0
  63. package/template/README.md +26 -0
  64. package/template/_gitignore +14 -0
  65. package/template/apps/server/Dockerfile +20 -0
  66. package/template/apps/server/package.json +27 -0
  67. package/template/apps/server/src/app.module.ts +43 -0
  68. package/template/apps/server/src/main.ts +5 -0
  69. package/template/apps/server/test/smoke.test.ts +16 -0
  70. package/template/apps/server/tsconfig.json +9 -0
  71. package/template/apps/web/data-api-live.e2e.html +15 -0
  72. package/template/apps/web/e2e/client-fixture.ts +5 -0
  73. package/template/apps/web/e2e/data-api-live-fixture.tsx +146 -0
  74. package/template/apps/web/e2e/data-api-live.spec.ts +138 -0
  75. package/template/apps/web/e2e/field-protocol-fixture.tsx +347 -0
  76. package/template/apps/web/e2e/field-protocol.spec.ts +186 -0
  77. package/template/apps/web/e2e/resources.spec.ts +285 -0
  78. package/template/apps/web/e2e/workflow.spec.ts +329 -0
  79. package/template/apps/web/field-protocol.e2e.html +15 -0
  80. package/template/apps/web/index.html +12 -0
  81. package/template/apps/web/package.json +32 -0
  82. package/template/apps/web/playwright.config.ts +44 -0
  83. package/template/apps/web/scripts/check.mjs +43 -0
  84. package/template/apps/web/scripts/verify-build.mjs +6 -0
  85. package/template/apps/web/src/main.tsx +21 -0
  86. package/template/apps/web/test/contracts.test.ts +99 -0
  87. package/template/apps/web/test/loopback.test.ts +62 -0
  88. package/template/apps/web/tsconfig.json +12 -0
  89. package/template/apps/web/vite.config.ts +31 -0
  90. package/template/openxiangda.config.ts +30 -0
  91. package/template/package.json +28 -0
  92. package/template/packages/contracts/package.json +23 -0
  93. package/template/packages/contracts/src/generated.ts +124 -0
  94. package/template/packages/contracts/src/index.ts +1 -0
  95. package/template/packages/contracts/tsconfig.json +9 -0
  96. package/template/pnpm-workspace.yaml +7 -0
  97. package/template/scripts/verify-template-budget.mjs +49 -0
  98. package/template/tsconfig.base.json +13 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAChE,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,kBAAkB;IACjD,MAAM,CAAC,OAAO,GAAG,mCAAmC,CAAC;IACrD,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,cAAc;QACjB,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;QACpD,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC;YACxB,OAAO,EAAE,sBAAsB;YAC/B,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,KAAK;YACV,SAAS,EAAE,QAAQ;SACpB,CAAC;KACH,CAAC;IACF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC,OAAO,CACjB,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE;YACjC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC;YACxB,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,SAAS;gBACjC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YACnC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE;gBACpB,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;SAChD,CAAC,CACH,CAAC;IACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { OpenXiangdaCommand } from "../base.js";
2
+ export default class Login extends OpenXiangdaCommand {
3
+ static summary: string;
4
+ static flags: {
5
+ "base-url": import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
6
+ "no-open": import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
+ };
8
+ run(): Promise<import("openxiangda-contracts").DevkitResult<unknown> | {
9
+ schemaVersion: string;
10
+ ok: boolean;
11
+ operation: string;
12
+ workspace: import("openxiangda-contracts").WorkspaceIdentity;
13
+ data: {} | null;
14
+ error: {
15
+ code: string;
16
+ message: string;
17
+ retryable: boolean;
18
+ remediation: string;
19
+ nextCommand: string | null;
20
+ } | null;
21
+ }>;
22
+ private openBrowser;
23
+ }
24
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,kBAAkB;IACnD,MAAM,CAAC,OAAO,SAAiC;IAC/C,MAAM,CAAC,KAAK;;;MASV;IAEI,GAAG;;;;;;;;;;;;;;IAqCT,OAAO,CAAC,WAAW;CAkBpB"}
@@ -0,0 +1,73 @@
1
+ import { Flags } from "@oclif/core";
2
+ import { spawn } from "node:child_process";
3
+ import { authorizeDeveloperSession } from "openxiangda-devkit-core";
4
+ import { OpenXiangdaCommand } from "../base.js";
5
+ export default class Login extends OpenXiangdaCommand {
6
+ static summary = "通过平台浏览器授权登录 OpenXiangda 2.0";
7
+ static flags = {
8
+ "base-url": Flags.string({
9
+ required: true,
10
+ env: "OPENXIANGDA_BASE_URL",
11
+ summary: "平台 service 基地址",
12
+ }),
13
+ "no-open": Flags.boolean({
14
+ summary: "不自动打开浏览器",
15
+ }),
16
+ };
17
+ async run() {
18
+ const { flags } = await this.parse(Login);
19
+ const result = await authorizeDeveloperSession({
20
+ baseUrl: flags["base-url"],
21
+ onAuthorization: async (authorization) => {
22
+ if (!this.jsonEnabled()) {
23
+ this.log(`请在浏览器确认授权:${authorization.loginUrl}`);
24
+ }
25
+ if (!flags["no-open"])
26
+ this.openBrowser(authorization.loginUrl);
27
+ },
28
+ });
29
+ return this.present({
30
+ ok: true,
31
+ operation: "login",
32
+ workspace: { appCode: "global", root: process.cwd() },
33
+ data: {
34
+ session: {
35
+ schemaVersion: result.session.schemaVersion,
36
+ baseUrl: result.session.baseUrl,
37
+ accessExpiresAt: result.session.accessTokenExpiresAt,
38
+ refreshExpiresAt: result.session.refreshTokenExpiresAt,
39
+ savedAt: result.session.savedAt,
40
+ source: result.session.source,
41
+ },
42
+ identity: result.identity,
43
+ },
44
+ diagnostics: [],
45
+ nextActions: [
46
+ {
47
+ code: "create",
48
+ label: "创建应用",
49
+ command: "openxiangda create <directory>",
50
+ },
51
+ ],
52
+ });
53
+ }
54
+ openBrowser(url) {
55
+ const command = process.platform === "darwin"
56
+ ? { file: "open", args: [url] }
57
+ : process.platform === "win32"
58
+ ? { file: "cmd", args: ["/c", "start", "", url] }
59
+ : { file: "xdg-open", args: [url] };
60
+ try {
61
+ const child = spawn(command.file, command.args, {
62
+ detached: true,
63
+ stdio: "ignore",
64
+ });
65
+ child.on("error", () => undefined);
66
+ child.unref();
67
+ }
68
+ catch {
69
+ // The human-readable URL remains visible if a browser cannot be opened.
70
+ }
71
+ }
72
+ }
73
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { OpenXiangdaCommand } from '../base.js';
2
+ export default class Logs extends OpenXiangdaCommand {
3
+ static summary: string;
4
+ static args: {
5
+ deploymentId: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
6
+ };
7
+ static flags: {
8
+ cwd: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ };
10
+ run(): Promise<import("openxiangda-contracts").DevkitResult<unknown> | {
11
+ schemaVersion: string;
12
+ ok: boolean;
13
+ operation: string;
14
+ workspace: import("openxiangda-contracts").WorkspaceIdentity;
15
+ data: {} | null;
16
+ error: {
17
+ code: string;
18
+ message: string;
19
+ retryable: boolean;
20
+ remediation: string;
21
+ nextCommand: string | null;
22
+ } | null;
23
+ }>;
24
+ }
25
+ //# sourceMappingURL=logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAkB,MAAM,YAAY,CAAC;AAChE,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,kBAAkB;IAClD,MAAM,CAAC,OAAO,SAA2B;IACzC,MAAM,CAAC,IAAI;;MAAmC;IAC9C,MAAM,CAAC,KAAK;;MAAkB;IACxB,GAAG;;;;;;;;;;;;;;CACV"}
@@ -0,0 +1,9 @@
1
+ import { Args } from '@oclif/core';
2
+ import { OpenXiangdaCommand, workspaceFlags } from '../base.js';
3
+ export default class Logs extends OpenXiangdaCommand {
4
+ static summary = '查询部署检查点和关联日志;默认最近一次部署';
5
+ static args = { deploymentId: Args.string() };
6
+ static flags = workspaceFlags;
7
+ async run() { const { args, flags } = await this.parse(Logs); return this.present(await this.services.deploymentLogs(flags.cwd, args.deploymentId)); }
8
+ }
9
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAChE,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,kBAAkB;IAClD,MAAM,CAAC,OAAO,GAAG,uBAAuB,CAAC;IACzC,MAAM,CAAC,IAAI,GAAG,EAAE,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;IAC9C,MAAM,CAAC,KAAK,GAAG,cAAc,CAAC;IAC9B,KAAK,CAAC,GAAG,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { OpenXiangdaCommand } from '../base.js';
2
+ export default class Rollback extends OpenXiangdaCommand {
3
+ static summary: string;
4
+ static flags: {
5
+ environment: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
6
+ to: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
7
+ cwd: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
+ };
9
+ run(): Promise<import("openxiangda-contracts").DevkitResult<unknown> | {
10
+ schemaVersion: string;
11
+ ok: boolean;
12
+ operation: string;
13
+ workspace: import("openxiangda-contracts").WorkspaceIdentity;
14
+ data: {} | null;
15
+ error: {
16
+ code: string;
17
+ message: string;
18
+ retryable: boolean;
19
+ remediation: string;
20
+ nextCommand: string | null;
21
+ } | null;
22
+ }>;
23
+ }
24
+ //# sourceMappingURL=rollback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollback.d.ts","sourceRoot":"","sources":["../../src/commands/rollback.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAkB,MAAM,YAAY,CAAC;AAChE,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,kBAAkB;IACtD,MAAM,CAAC,OAAO,SAA2B;IACzC,MAAM,CAAC,KAAK;;;;MAIV;IACI,GAAG;;;;;;;;;;;;;;CAKV"}
@@ -0,0 +1,16 @@
1
+ import { Flags } from '@oclif/core';
2
+ import { OpenXiangdaCommand, workspaceFlags } from '../base.js';
3
+ export default class Rollback extends OpenXiangdaCommand {
4
+ static summary = '以历史 AppVersion 创建回滚部署';
5
+ static flags = {
6
+ ...workspaceFlags,
7
+ environment: Flags.string({ options: ['test', 'production'], default: 'test' }),
8
+ to: Flags.string({ required: true, summary: '目标 AppVersion ID' }),
9
+ };
10
+ async run() {
11
+ const { flags } = await this.parse(Rollback);
12
+ const environment = flags.environment === 'production' ? 'production' : 'preproduction';
13
+ return this.present(await this.services.rollback(flags.cwd, environment, flags.to));
14
+ }
15
+ }
16
+ //# sourceMappingURL=rollback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollback.js","sourceRoot":"","sources":["../../src/commands/rollback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAChE,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,kBAAkB;IACtD,MAAM,CAAC,OAAO,GAAG,uBAAuB,CAAC;IACzC,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,cAAc;QACjB,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAC/E,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC;KAClE,CAAC;IACF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC;QACxF,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACtF,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { OpenXiangdaCommand } from '../base.js';
2
+ export default class Skill extends OpenXiangdaCommand {
3
+ static summary: string;
4
+ static args: {
5
+ action: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
6
+ };
7
+ static flags: {
8
+ destination: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ };
11
+ run(): Promise<import("openxiangda-contracts").DevkitResult<unknown> | {
12
+ schemaVersion: string;
13
+ ok: boolean;
14
+ operation: string;
15
+ workspace: import("openxiangda-contracts").WorkspaceIdentity;
16
+ data: {} | null;
17
+ error: {
18
+ code: string;
19
+ message: string;
20
+ retryable: boolean;
21
+ remediation: string;
22
+ nextCommand: string | null;
23
+ } | null;
24
+ }>;
25
+ }
26
+ //# sourceMappingURL=skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,kBAAkB;IACnD,MAAM,CAAC,OAAO,SAA2C;IACzD,MAAM,CAAC,IAAI;;MAET;IACF,MAAM,CAAC,KAAK;;;MASV;IAEI,GAAG;;;;;;;;;;;;;;CAuBV"}
@@ -0,0 +1,43 @@
1
+ import { Args, Flags } from '@oclif/core';
2
+ import { homedir } from 'node:os';
3
+ import { join, resolve } from 'node:path';
4
+ import { installSkills, resolveDefaultSkillsRoot, } from 'openxiangda-skill-kit';
5
+ import { OpenXiangdaCommand } from '../base.js';
6
+ export default class Skill extends OpenXiangdaCommand {
7
+ static summary = '安装或更新与当前 openxiangda 版本完全一致的 AI Skill';
8
+ static args = {
9
+ action: Args.string({ required: true, options: ['install'] }),
10
+ };
11
+ static flags = {
12
+ destination: Flags.string({
13
+ summary: 'AI Skill 根目录;默认使用 Codex Skill 目录',
14
+ helpValue: '<directory>',
15
+ }),
16
+ force: Flags.boolean({
17
+ default: false,
18
+ summary: '原子替换已安装的同名 Skill',
19
+ }),
20
+ };
21
+ async run() {
22
+ const { args, flags } = await this.parse(Skill);
23
+ if (args.action !== 'install') {
24
+ throw new Error(`OPENXIANGDA_SKILL_ACTION_UNSUPPORTED:${args.action}`);
25
+ }
26
+ const destination = resolve(flags.destination ||
27
+ join(process.env.CODEX_HOME || join(homedir(), '.codex'), 'skills'));
28
+ const result = await installSkills({
29
+ skillsRoot: resolveDefaultSkillsRoot(),
30
+ destination,
31
+ force: flags.force,
32
+ });
33
+ return this.present({
34
+ ok: true,
35
+ operation: 'skill install',
36
+ workspace: { appCode: 'global', root: process.cwd() },
37
+ data: result,
38
+ diagnostics: [],
39
+ nextActions: [],
40
+ });
41
+ }
42
+ }
43
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EACL,aAAa,EACb,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,kBAAkB;IACnD,MAAM,CAAC,OAAO,GAAG,uCAAuC,CAAC;IACzD,MAAM,CAAC,IAAI,GAAG;QACZ,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;KAC9D,CAAC;IACF,MAAM,CAAC,KAAK,GAAG;QACb,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC;YACxB,OAAO,EAAE,kCAAkC;YAC3C,SAAS,EAAE,aAAa;SACzB,CAAC;QACF,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;YACnB,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,kBAAkB;SAC5B,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,WAAW,GAAG,OAAO,CACzB,KAAK,CAAC,WAAW;YACf,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,CACtE,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC;YACjC,UAAU,EAAE,wBAAwB,EAAE;YACtC,WAAW;YACX,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,OAAO,CAAC;YAClB,EAAE,EAAE,IAAI;YACR,SAAS,EAAE,eAAe;YAC1B,SAAS,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE;YACrD,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,EAAE;YACf,WAAW,EAAE,EAAE;SAChB,CAAC,CAAC;IACL,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { OpenXiangdaCommand } from '../base.js';
2
+ export default class Status extends OpenXiangdaCommand {
3
+ static summary: string;
4
+ static args: {
5
+ deploymentId: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
6
+ };
7
+ static flags: {
8
+ cwd: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ };
10
+ run(): Promise<import("openxiangda-contracts").DevkitResult<unknown> | {
11
+ schemaVersion: string;
12
+ ok: boolean;
13
+ operation: string;
14
+ workspace: import("openxiangda-contracts").WorkspaceIdentity;
15
+ data: {} | null;
16
+ error: {
17
+ code: string;
18
+ message: string;
19
+ retryable: boolean;
20
+ remediation: string;
21
+ nextCommand: string | null;
22
+ } | null;
23
+ }>;
24
+ }
25
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAkB,MAAM,YAAY,CAAC;AAChE,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,kBAAkB;IACpD,MAAM,CAAC,OAAO,SAAkC;IAChD,MAAM,CAAC,IAAI;;MAAmC;IAC9C,MAAM,CAAC,KAAK;;MAAkB;IACxB,GAAG;;;;;;;;;;;;;;CACV"}
@@ -0,0 +1,9 @@
1
+ import { Args } from '@oclif/core';
2
+ import { OpenXiangdaCommand, workspaceFlags } from '../base.js';
3
+ export default class Status extends OpenXiangdaCommand {
4
+ static summary = '查询 DeploymentRun 状态;默认最近一次部署';
5
+ static args = { deploymentId: Args.string() };
6
+ static flags = workspaceFlags;
7
+ async run() { const { args, flags } = await this.parse(Status); return this.present(await this.services.deploymentStatus(flags.cwd, args.deploymentId)); }
8
+ }
9
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAChE,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,kBAAkB;IACpD,MAAM,CAAC,OAAO,GAAG,8BAA8B,CAAC;IAChD,MAAM,CAAC,IAAI,GAAG,EAAE,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;IAC9C,MAAM,CAAC,KAAK,GAAG,cAAc,CAAC;IAC9B,KAAK,CAAC,GAAG,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { resolveCliToolchainCapsule } from "./toolchain-capsule.js";
2
+ export interface CreateWorkspaceInput {
3
+ directory: string;
4
+ appCode: string;
5
+ name: string;
6
+ install?: boolean;
7
+ installOutput?: WorkspaceInstallOutput;
8
+ templateRoot?: string;
9
+ localSdkRoot?: string;
10
+ }
11
+ export type WorkspaceInstallOutput = "inherit" | "capture";
12
+ export interface PrepareWorkspaceOptions {
13
+ installOutput?: WorkspaceInstallOutput;
14
+ toolchainCapsule?: ReturnType<typeof resolveCliToolchainCapsule>;
15
+ }
16
+ export declare function createWorkspace(input: CreateWorkspaceInput): Promise<{
17
+ localSdkRoot?: string;
18
+ root: string;
19
+ appCode: string;
20
+ name: string;
21
+ installed: boolean;
22
+ generated: boolean;
23
+ generationDeferred: boolean;
24
+ }>;
25
+ export declare function prepareWorkspace(directory: string, options?: PrepareWorkspaceOptions): Promise<{
26
+ output: string;
27
+ changed: boolean;
28
+ contractDigest: string;
29
+ aiCatalogDigest: string;
30
+ } | undefined>;
31
+ //# sourceMappingURL=create-workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-workspace.d.ts","sourceRoot":"","sources":["../src/create-workspace.ts"],"names":[],"mappings":"AAmBA,OAAO,EACL,0BAA0B,EAE3B,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,SAAS,CAAC;AAE3D,MAAM,WAAW,uBAAuB;IACtC,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,gBAAgB,CAAC,EAAE,UAAU,CAAC,OAAO,0BAA0B,CAAC,CAAC;CAClE;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,oBAAoB;;;;;;;;GAuDhE;AAED,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,uBAA4B;;;;;eA6BtC"}
@@ -0,0 +1,273 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { cpSync, existsSync, mkdirSync, readFileSync, readdirSync, renameSync, statSync, writeFileSync, } from "node:fs";
3
+ import { dirname, join, relative, resolve } from "node:path";
4
+ import { collectWorkspaceToolchainDependencies, isOpenXiangdaPackageName, OpenXiangdaApplicationServices, toolchainCapsuleDiagnostic, } from "openxiangda-devkit-core";
5
+ import { resolveCliToolchainCapsule, resolveDefaultTemplate, } from "./toolchain-capsule.js";
6
+ export async function createWorkspace(input) {
7
+ const target = resolve(input.directory);
8
+ const template = input.templateRoot
9
+ ? resolve(input.templateRoot)
10
+ : resolveDefaultTemplate();
11
+ if (!/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/.test(input.appCode)) {
12
+ throw new Error("APP_CODE_INVALID: appCode 必须是 kebab-case");
13
+ }
14
+ if (!input.name.trim())
15
+ throw new Error("APP_NAME_REQUIRED");
16
+ if (!existsSync(template))
17
+ throw new Error(`TEMPLATE_NOT_FOUND: ${template}`);
18
+ if (existsSync(target) && readdirSync(target).length > 0) {
19
+ throw new Error(`TARGET_DIRECTORY_NOT_EMPTY: ${target}`);
20
+ }
21
+ mkdirSync(dirname(target), { recursive: true });
22
+ cpSync(template, target, {
23
+ recursive: true,
24
+ errorOnExist: false,
25
+ filter: source => includeTemplatePath(template, source),
26
+ });
27
+ const packedGitignore = join(target, "_gitignore");
28
+ if (existsSync(packedGitignore))
29
+ renameSync(packedGitignore, join(target, ".gitignore"));
30
+ replaceText(target, [
31
+ ["instrument-center", input.appCode],
32
+ ["仪器资源管理", input.name],
33
+ ["openxiangda-application", input.appCode],
34
+ ["OpenXiangda 应用", input.name],
35
+ ]);
36
+ const toolchainCapsule = resolveCliToolchainCapsule(template);
37
+ normalizePublishedDependencies(target, new Map(Object.entries(toolchainCapsule.packages)));
38
+ const localSdkRoot = input.localSdkRoot
39
+ ? configureLocalSdk(target, input.localSdkRoot)
40
+ : undefined;
41
+ const install = input.install !== false;
42
+ if (install) {
43
+ await prepareWorkspace(target, {
44
+ ...(input.installOutput ? { installOutput: input.installOutput } : {}),
45
+ toolchainCapsule,
46
+ });
47
+ }
48
+ return {
49
+ root: target,
50
+ appCode: input.appCode,
51
+ name: input.name,
52
+ installed: install,
53
+ generated: install,
54
+ generationDeferred: !install,
55
+ ...(localSdkRoot ? { localSdkRoot } : {}),
56
+ };
57
+ }
58
+ export async function prepareWorkspace(directory, options = {}) {
59
+ const root = resolve(directory);
60
+ const toolchainCapsule = options.toolchainCapsule || resolveCliToolchainCapsule();
61
+ const capsuleDiagnostic = toolchainCapsuleDiagnostic(collectWorkspaceToolchainDependencies(root), toolchainCapsule);
62
+ if (capsuleDiagnostic)
63
+ throw workspaceCapsuleError(capsuleDiagnostic);
64
+ const result = spawnSync("pnpm", ["install"], options.installOutput === "capture"
65
+ ? { cwd: root, encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] }
66
+ : { cwd: root, stdio: "inherit" });
67
+ if (result.error || result.status !== 0)
68
+ throw workspaceInstallError();
69
+ const generated = await new OpenXiangdaApplicationServices({
70
+ toolchainCapsule,
71
+ }).generate({ root });
72
+ if (!generated.ok) {
73
+ throw new Error(`WORKSPACE_GENERATE_FAILED: ${generated.diagnostics
74
+ .map((item) => item.message)
75
+ .join("; ")}`);
76
+ }
77
+ return generated.data;
78
+ }
79
+ function workspaceCapsuleError(diagnostic) {
80
+ return Object.assign(new Error(`${diagnostic.code}: ${diagnostic.message}`), {
81
+ code: diagnostic.code,
82
+ data: diagnostic,
83
+ retryable: false,
84
+ });
85
+ }
86
+ function workspaceInstallError() {
87
+ return Object.assign(new Error("WORKSPACE_INSTALL_FAILED: 依赖安装失败;请检查网络或包管理器配置后重试"), { code: "WORKSPACE_INSTALL_FAILED", retryable: true });
88
+ }
89
+ function includeTemplatePath(templateRoot, source) {
90
+ const path = relative(templateRoot, source).replaceAll("\\", "/");
91
+ if (!path)
92
+ return true;
93
+ return !/(?:^|\/)(?:node_modules|dist|coverage|playwright-report|test-results|\.openxiangda|\.turbo|\.turbopack|\.umi|\.umi-production)(?:\/|$)/.test(path);
94
+ }
95
+ function configureLocalSdk(workspaceRoot, inputRoot) {
96
+ const sdkRoot = resolve(inputRoot);
97
+ const packagesRoot = join(sdkRoot, "packages");
98
+ if (!existsSync(packagesRoot)) {
99
+ throw new Error(`LOCAL_SDK_ROOT_INVALID: ${sdkRoot}`);
100
+ }
101
+ const overrides = {};
102
+ const localPackages = new Map();
103
+ for (const entry of readdirSync(packagesRoot, { withFileTypes: true })) {
104
+ if (!entry.isDirectory())
105
+ continue;
106
+ const packageRoot = join(packagesRoot, entry.name);
107
+ const packageJsonPath = join(packageRoot, "package.json");
108
+ if (!existsSync(packageJsonPath))
109
+ continue;
110
+ const manifest = JSON.parse(readFileSync(packageJsonPath, "utf8"));
111
+ const name = typeof manifest.name === "string" ? manifest.name : "";
112
+ if (isOpenXiangdaPackageName(name)) {
113
+ localPackages.set(name, { root: packageRoot, manifest });
114
+ }
115
+ }
116
+ const required = workspaceSdkDependencies(workspaceRoot, localPackages);
117
+ const artifactsRoot = join(workspaceRoot, ".openxiangda", "local-sdk-artifacts");
118
+ mkdirSync(artifactsRoot, { recursive: true });
119
+ for (const name of [...required].sort()) {
120
+ const localPackage = localPackages.get(name);
121
+ if (!localPackage)
122
+ throw new Error(`LOCAL_SDK_PACKAGE_NOT_FOUND: ${name}`);
123
+ const packageRoot = localPackage.root;
124
+ const built = spawnSync("pnpm", ["run", "build"], {
125
+ cwd: packageRoot,
126
+ encoding: "utf8",
127
+ });
128
+ if (built.status !== 0) {
129
+ throw new Error(`LOCAL_SDK_BUILD_FAILED: ${name}\n${String(built.stdout || "")}${String(built.stderr || "")}`);
130
+ }
131
+ const packed = spawnSync("pnpm", ["pack", "--pack-destination", artifactsRoot], { cwd: packageRoot, encoding: "utf8" });
132
+ if (packed.status !== 0) {
133
+ throw new Error(`LOCAL_SDK_PACK_FAILED: ${name}\n${String(packed.stdout || "")}${String(packed.stderr || "")}`);
134
+ }
135
+ const tarball = String(packed.stdout || "")
136
+ .trim()
137
+ .split(/\r?\n/)
138
+ .at(-1);
139
+ if (!tarball || !existsSync(tarball)) {
140
+ throw new Error(`LOCAL_SDK_TARBALL_NOT_FOUND: ${name}`);
141
+ }
142
+ overrides[name] = `file:${tarball}`;
143
+ }
144
+ if (Object.keys(overrides).length === 0) {
145
+ throw new Error(`LOCAL_SDK_PACKAGES_NOT_FOUND: ${packagesRoot}`);
146
+ }
147
+ const rootPackagePath = join(workspaceRoot, "package.json");
148
+ const rootPackage = JSON.parse(readFileSync(rootPackagePath, "utf8"));
149
+ const existingPnpm = rootPackage.pnpm && typeof rootPackage.pnpm === "object"
150
+ ? rootPackage.pnpm
151
+ : {};
152
+ rootPackage.pnpm = {
153
+ ...existingPnpm,
154
+ overrides: {
155
+ ...(existingPnpm.overrides && typeof existingPnpm.overrides === "object"
156
+ ? existingPnpm.overrides
157
+ : {}),
158
+ ...overrides,
159
+ },
160
+ };
161
+ writeFileSync(rootPackagePath, `${JSON.stringify(rootPackage, null, 2)}\n`, "utf8");
162
+ return sdkRoot;
163
+ }
164
+ function workspaceSdkDependencies(workspaceRoot, localPackages) {
165
+ const required = new Set();
166
+ const queue = [];
167
+ const addDependencies = (manifest, sections) => {
168
+ for (const section of sections) {
169
+ const dependencies = manifest[section];
170
+ if (!dependencies || typeof dependencies !== "object")
171
+ continue;
172
+ for (const name of Object.keys(dependencies)) {
173
+ if (!localPackages.has(name) || required.has(name))
174
+ continue;
175
+ required.add(name);
176
+ queue.push(name);
177
+ }
178
+ }
179
+ };
180
+ const visit = (directory) => {
181
+ for (const entry of readdirSync(directory, { withFileTypes: true })) {
182
+ if (["node_modules", "dist", ".git", ".openxiangda"].includes(entry.name))
183
+ continue;
184
+ const path = join(directory, entry.name);
185
+ if (entry.isDirectory())
186
+ visit(path);
187
+ else if (entry.isFile() && entry.name === "package.json") {
188
+ addDependencies(JSON.parse(readFileSync(path, "utf8")), ["dependencies", "devDependencies", "optionalDependencies"]);
189
+ }
190
+ }
191
+ };
192
+ visit(workspaceRoot);
193
+ for (let index = 0; index < queue.length; index += 1) {
194
+ const localPackage = localPackages.get(queue[index]);
195
+ if (localPackage) {
196
+ addDependencies(localPackage.manifest, [
197
+ "dependencies",
198
+ "optionalDependencies",
199
+ ]);
200
+ }
201
+ }
202
+ return required;
203
+ }
204
+ function normalizePublishedDependencies(root, dependencyVersions) {
205
+ const visit = (directory) => {
206
+ for (const entry of readdirSync(directory, { withFileTypes: true })) {
207
+ if (["node_modules", "dist", ".git"].includes(entry.name))
208
+ continue;
209
+ const path = join(directory, entry.name);
210
+ if (entry.isDirectory()) {
211
+ visit(path);
212
+ continue;
213
+ }
214
+ if (!entry.isFile() || entry.name !== "package.json")
215
+ continue;
216
+ const packageJson = JSON.parse(readFileSync(path, "utf8"));
217
+ let changed = false;
218
+ for (const section of [
219
+ "dependencies",
220
+ "devDependencies",
221
+ "peerDependencies",
222
+ "optionalDependencies",
223
+ ]) {
224
+ const dependencies = packageJson[section];
225
+ if (!dependencies || typeof dependencies !== "object")
226
+ continue;
227
+ for (const [name, version] of Object.entries(dependencies)) {
228
+ if (!isOpenXiangdaPackageName(name) || typeof version !== "string")
229
+ continue;
230
+ if (!version.startsWith("workspace:"))
231
+ continue;
232
+ const declaredVersion = version.slice("workspace:".length);
233
+ const publishedVersion = dependencyVersions.get(name);
234
+ if (!publishedVersion && declaredVersion === "*") {
235
+ throw new Error(`TEMPLATE_DEPENDENCY_VERSION_UNRESOLVED: ${name}`);
236
+ }
237
+ dependencies[name] =
238
+ publishedVersion || declaredVersion;
239
+ changed = true;
240
+ }
241
+ }
242
+ if (changed)
243
+ writeFileSync(path, `${JSON.stringify(packageJson, null, 2)}\n`, "utf8");
244
+ }
245
+ };
246
+ visit(root);
247
+ }
248
+ function replaceText(root, replacements) {
249
+ const visit = (directory) => {
250
+ for (const entry of readdirSync(directory, { withFileTypes: true })) {
251
+ if (["node_modules", "dist", ".git"].includes(entry.name))
252
+ continue;
253
+ const path = join(directory, entry.name);
254
+ if (entry.isDirectory())
255
+ visit(path);
256
+ else if (entry.isFile() && isText(path)) {
257
+ let content = readFileSync(path, "utf8");
258
+ for (const [search, replacement] of replacements) {
259
+ content = content.replaceAll(search, replacement);
260
+ }
261
+ writeFileSync(path, content, "utf8");
262
+ }
263
+ }
264
+ };
265
+ visit(root);
266
+ }
267
+ function isText(path) {
268
+ if (statSync(path).size > 2_000_000)
269
+ return false;
270
+ return (/\.(?:json|ts|tsx|js|mjs|css|html|md|ya?ml|txt)$/.test(path) ||
271
+ /(?:Dockerfile|\.gitignore|pnpm-workspace\.yaml)$/.test(path));
272
+ }
273
+ //# sourceMappingURL=create-workspace.js.map