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
package/README.md ADDED
@@ -0,0 +1,13 @@
1
+ # openxiangda-cli
2
+
3
+ OpenXiangda 2.0 installs one developer CLI with eight application lifecycle commands—`create`, `dev`, `check`, `deploy`, `status`, `logs`, `rollback`, and `login`—plus `skill install` for installing the exact AI guidance bundled with the same release.
4
+
5
+ The CLI disables user, development and JIT plugin loading. A clean build removes orphaned command output before TypeScript compilation. `--json` emits one stable result envelope and never mixes progress logs into machine output.
6
+
7
+ AI-native development clients use the same pinned executable in pre-command
8
+ stdio mode: `pnpm exec openxiangda --mcp-stdio --cwd <workspace>`. They can read
9
+ `openxiangda://workspace/contracts` or call `contract_describe` to obtain the
10
+ compiler-owned `aiCatalog` and `aiCatalogDigest`. This transport does not add a
11
+ another executable and applications must not implement a second MCP server.
12
+
13
+ `dev` starts local Web/Nest hot reload and a loopback connected proxy. `deploy` defaults to test; production explicitly reuses a successful test AppVersion. Application binding, initialization, generation, tests and builds are internal stages rather than separate commands.
package/bin/run.js ADDED
@@ -0,0 +1,92 @@
1
+ #!/usr/bin/env node
2
+ import { execute } from '@oclif/core';
3
+ import { readFileSync } from 'node:fs';
4
+ import { fileURLToPath } from 'node:url';
5
+
6
+ const publicCommands = new Set([
7
+ 'create',
8
+ 'dev',
9
+ 'check',
10
+ 'accept',
11
+ 'deploy',
12
+ 'status',
13
+ 'logs',
14
+ 'rollback',
15
+ 'login',
16
+ 'skill',
17
+ ]);
18
+ const args = process.argv.slice(2);
19
+
20
+ if (args.includes('--mcp-stdio')) {
21
+ const allowed = new Set(['--mcp-stdio', '--cwd']);
22
+ for (let index = 0; index < args.length; index += 1) {
23
+ const argument = args[index];
24
+ if (argument === '--cwd') {
25
+ index += 1;
26
+ if (!args[index]) throw new Error('OPENXIANGDA_MCP_CWD_REQUIRED');
27
+ continue;
28
+ }
29
+ if (!allowed.has(argument)) {
30
+ throw new Error(`OPENXIANGDA_MCP_ARGUMENT_INVALID: ${argument}`);
31
+ }
32
+ }
33
+ const cwdIndex = args.indexOf('--cwd');
34
+ const root = cwdIndex >= 0 ? args[cwdIndex + 1] : undefined;
35
+ const { runStdioServer } = await import('openxiangda-mcp');
36
+ await runStdioServer(root ? { root } : {});
37
+ } else {
38
+ const command = args.find(argument => !argument.startsWith('-'));
39
+
40
+ if (command && !publicCommands.has(command)) {
41
+ const nextCommand = 'openxiangda --help';
42
+ if (args.includes('--json')) {
43
+ process.stdout.write(`${JSON.stringify({
44
+ schemaVersion: 'openxiangda.cli-result/v2',
45
+ ok: false,
46
+ operation: command,
47
+ workspace: null,
48
+ data: null,
49
+ error: {
50
+ code: 'OPENXIANGDA_COMMAND_NOT_FOUND',
51
+ message: `未知命令: ${command}`,
52
+ retryable: false,
53
+ remediation: `运行 ${nextCommand}`,
54
+ nextCommand,
55
+ },
56
+ })}\n`);
57
+ } else {
58
+ process.stderr.write(`未知命令: ${command}\n运行 ${nextCommand}\n`);
59
+ }
60
+ process.exitCode = 2;
61
+ } else {
62
+ const root = fileURLToPath(new URL('../', import.meta.url));
63
+ const cliManifest = JSON.parse(
64
+ readFileSync(new URL('../package.json', import.meta.url), 'utf8')
65
+ );
66
+ const distributionManifest = process.env.OPENXIANGDA_DISTRIBUTION_NAME
67
+ ? {
68
+ ...cliManifest,
69
+ name: process.env.OPENXIANGDA_DISTRIBUTION_NAME,
70
+ version:
71
+ process.env.OPENXIANGDA_DISTRIBUTION_VERSION ||
72
+ cliManifest.version,
73
+ }
74
+ : undefined;
75
+ await execute({
76
+ args,
77
+ loadOptions: {
78
+ root,
79
+ ...(distributionManifest ? { pjson: distributionManifest } : {}),
80
+ ...(process.env.OPENXIANGDA_DISTRIBUTION_NAME
81
+ ? { name: process.env.OPENXIANGDA_DISTRIBUTION_NAME }
82
+ : {}),
83
+ ...(process.env.OPENXIANGDA_DISTRIBUTION_VERSION
84
+ ? { version: process.env.OPENXIANGDA_DISTRIBUTION_VERSION }
85
+ : {}),
86
+ userPlugins: false,
87
+ devPlugins: false,
88
+ jitPlugins: false,
89
+ },
90
+ });
91
+ }
92
+ }
package/dist/base.d.ts ADDED
@@ -0,0 +1,44 @@
1
+ import { Command } from "@oclif/core";
2
+ import type { DevkitResult } from "openxiangda-contracts";
3
+ import { OpenXiangdaApplicationServices } from "openxiangda-devkit-core";
4
+ export declare const workspaceFlags: {
5
+ cwd: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
6
+ };
7
+ export declare abstract class OpenXiangdaCommand extends Command {
8
+ static enableJsonFlag: boolean;
9
+ protected readonly services: OpenXiangdaApplicationServices;
10
+ protected catch(error: Error & {
11
+ exitCode?: number;
12
+ }): Promise<void>;
13
+ protected present(result: DevkitResult<unknown>): DevkitResult<unknown> | {
14
+ schemaVersion: string;
15
+ ok: boolean;
16
+ operation: string;
17
+ workspace: import("openxiangda-contracts").WorkspaceIdentity;
18
+ data: {} | null;
19
+ error: {
20
+ code: string;
21
+ message: string;
22
+ retryable: boolean;
23
+ remediation: string;
24
+ nextCommand: string | null;
25
+ } | null;
26
+ };
27
+ protected toErrorJson(error: unknown): {
28
+ schemaVersion: string;
29
+ ok: boolean;
30
+ operation: string;
31
+ workspace: null;
32
+ data: null;
33
+ error: {
34
+ code: string;
35
+ message: string;
36
+ retryable: boolean;
37
+ remediation: string;
38
+ nextCommand: string;
39
+ };
40
+ };
41
+ private envelope;
42
+ private errorNextCommand;
43
+ }
44
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AAGzE,eAAO,MAAM,cAAc;;CAE1B,CAAC;AAEF,8BAAsB,kBAAmB,SAAQ,OAAO;IACtD,MAAM,CAAC,cAAc,UAAQ;IAE7B,SAAS,CAAC,QAAQ,CAAC,QAAQ,iCAExB;cAEa,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;IAS1D,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC;;;;;;;;;;;;;;IAc/C,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO;;;;;;;;;;;;;;IAsCpC,OAAO,CAAC,QAAQ;IAyBhB,OAAO,CAAC,gBAAgB;CA2BzB"}
package/dist/base.js ADDED
@@ -0,0 +1,119 @@
1
+ import { Command, Flags } from "@oclif/core";
2
+ import { OpenXiangdaApplicationServices } from "openxiangda-devkit-core";
3
+ import { resolveCliToolchainCapsule } from "./toolchain-capsule.js";
4
+ export const workspaceFlags = {
5
+ cwd: Flags.string({ summary: "应用工作区目录", helpValue: "<directory>" }),
6
+ };
7
+ export class OpenXiangdaCommand extends Command {
8
+ static enableJsonFlag = true;
9
+ services = new OpenXiangdaApplicationServices({
10
+ toolchainCapsule: resolveCliToolchainCapsule(),
11
+ });
12
+ async catch(error) {
13
+ process.exitCode = error.exitCode ?? 1;
14
+ if (this.jsonEnabled()) {
15
+ this.logJson(this.toErrorJson(error));
16
+ return;
17
+ }
18
+ throw error;
19
+ }
20
+ present(result) {
21
+ if (!result.ok)
22
+ process.exitCode = 1;
23
+ if (this.jsonEnabled())
24
+ return this.envelope(result);
25
+ this.log(`${result.ok ? "✓" : "✗"} ${result.operation}`);
26
+ for (const diagnostic of result.diagnostics) {
27
+ this.log(` ${diagnostic.code}: ${diagnostic.message}`);
28
+ if (diagnostic.remediation)
29
+ this.log(` → ${diagnostic.remediation}`);
30
+ }
31
+ if (result.data !== undefined) {
32
+ this.log(JSON.stringify(result.data, null, 2));
33
+ }
34
+ return result;
35
+ }
36
+ toErrorJson(error) {
37
+ const message = error instanceof Error ? error.message : String(error || "未知错误");
38
+ const code = String(error?.code ||
39
+ message.match(/^([A-Z][A-Z0-9_]+)/)?.[1] ||
40
+ "OPENXIANGDA_COMMAND_FAILED");
41
+ const nextCommand = this.errorNextCommand(code);
42
+ const declaredRemediation = error?.remote?.remediation ||
43
+ error?.data?.remediation;
44
+ const retryable = Boolean(error?.retryable ||
45
+ error?.remote?.retryable ||
46
+ (error?.status &&
47
+ Number(error.status) >= 500) ||
48
+ /NETWORK|TIMEOUT|UNAVAILABLE|RATE_LIMIT/.test(code));
49
+ return {
50
+ schemaVersion: "openxiangda.cli-result/v2",
51
+ ok: false,
52
+ operation: this.id || "unknown",
53
+ workspace: null,
54
+ data: null,
55
+ error: {
56
+ code,
57
+ message: message.replace(/^([A-Z][A-Z0-9_]+):\s*/, ""),
58
+ retryable,
59
+ remediation: typeof declaredRemediation === "string"
60
+ ? declaredRemediation
61
+ : `运行 ${nextCommand}`,
62
+ nextCommand,
63
+ },
64
+ };
65
+ }
66
+ envelope(result) {
67
+ const diagnostic = result.diagnostics.find(item => item.severity === "error");
68
+ const nextCommand = result.nextActions.find(action => action.command?.startsWith("openxiangda "))
69
+ ?.command || (diagnostic ? this.errorNextCommand(diagnostic.code) : null);
70
+ return {
71
+ schemaVersion: "openxiangda.cli-result/v2",
72
+ ok: result.ok,
73
+ operation: result.operation,
74
+ workspace: result.workspace,
75
+ data: result.data ?? null,
76
+ error: diagnostic
77
+ ? {
78
+ code: diagnostic.code,
79
+ message: diagnostic.message,
80
+ retryable: diagnostic.retryable,
81
+ remediation: diagnostic.remediation ||
82
+ (nextCommand ? `运行 ${nextCommand}` : "检查错误后重试"),
83
+ nextCommand,
84
+ }
85
+ : null,
86
+ };
87
+ }
88
+ errorNextCommand(code) {
89
+ if (/AUTH|LOGIN|SESSION|TOKEN/.test(code)) {
90
+ return "openxiangda login --base-url <platform>";
91
+ }
92
+ if (/PRODUCTION|PROMOTION/.test(code)) {
93
+ return "openxiangda deploy --environment production --from <test-deployment-id>";
94
+ }
95
+ const currentCommand = {
96
+ create: "openxiangda create <directory>",
97
+ dev: "openxiangda dev",
98
+ check: "openxiangda check",
99
+ accept: "openxiangda accept --plan <file>",
100
+ deploy: "openxiangda deploy",
101
+ status: "openxiangda status",
102
+ logs: "openxiangda logs",
103
+ rollback: "openxiangda rollback --to <app-version-id>",
104
+ login: "openxiangda login --base-url <platform>",
105
+ };
106
+ const currentId = this.id;
107
+ if (currentId && currentCommand[currentId])
108
+ return currentCommand[currentId];
109
+ if (/LINK|WORKSPACE|APP_CODE|APP_NAME|TARGET_DIRECTORY/.test(code)) {
110
+ return "openxiangda create <directory>";
111
+ }
112
+ if (/DEPLOYMENT|STATUS|LOG/.test(code))
113
+ return "openxiangda status";
114
+ if (/DEV/.test(code))
115
+ return "openxiangda dev";
116
+ return "openxiangda check";
117
+ }
118
+ }
119
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { OpenXiangdaCommand } from "../base.js";
2
+ export default class Accept extends OpenXiangdaCommand {
3
+ static summary: string;
4
+ static flags: {
5
+ plan: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
6
+ cwd: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
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
+ }
23
+ //# sourceMappingURL=accept.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accept.d.ts","sourceRoot":"","sources":["../../src/commands/accept.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAkB,MAAM,YAAY,CAAC;AAEhE,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,kBAAkB;IACpD,MAAM,CAAC,OAAO,SAA0B;IACxC,MAAM,CAAC,KAAK;;;MAOV;IAEI,GAAG;;;;;;;;;;;;;;CASV"}
@@ -0,0 +1,21 @@
1
+ import { Flags } from "@oclif/core";
2
+ import { OpenXiangdaCommand, workspaceFlags } from "../base.js";
3
+ export default class Accept extends OpenXiangdaCommand {
4
+ static summary = "手动准备真实预发身份验收;不属于发布门禁";
5
+ static flags = {
6
+ ...workspaceFlags,
7
+ plan: Flags.string({
8
+ required: true,
9
+ summary: "预发身份验收计划 JSON 文件",
10
+ helpValue: "<file>",
11
+ }),
12
+ };
13
+ async run() {
14
+ const { flags } = await this.parse(Accept);
15
+ return this.present(await this.services.accept({
16
+ ...(flags.cwd ? { root: flags.cwd } : {}),
17
+ planPath: flags.plan,
18
+ }));
19
+ }
20
+ }
21
+ //# sourceMappingURL=accept.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accept.js","sourceRoot":"","sources":["../../src/commands/accept.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,kBAAkB;IACpD,MAAM,CAAC,OAAO,GAAG,sBAAsB,CAAC;IACxC,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,cAAc;QACjB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;YACjB,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,kBAAkB;YAC3B,SAAS,EAAE,QAAQ;SACpB,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC,OAAO,CACjB,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YACzB,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzC,QAAQ,EAAE,KAAK,CAAC,IAAI;SACrB,CAAC,CACH,CAAC;IACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { OpenXiangdaCommand } from '../base.js';
2
+ export default class Check extends OpenXiangdaCommand {
3
+ static summary: string;
4
+ static flags: {
5
+ cwd: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
6
+ };
7
+ run(): Promise<import("openxiangda-contracts").DevkitResult<unknown> | {
8
+ schemaVersion: string;
9
+ ok: boolean;
10
+ operation: string;
11
+ workspace: import("openxiangda-contracts").WorkspaceIdentity;
12
+ data: {} | null;
13
+ error: {
14
+ code: string;
15
+ message: string;
16
+ retryable: boolean;
17
+ remediation: string;
18
+ nextCommand: string | null;
19
+ } | null;
20
+ }>;
21
+ }
22
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAkB,MAAM,YAAY,CAAC;AAChE,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,kBAAkB;IACnD,MAAM,CAAC,OAAO,SAAe;IAC7B,MAAM,CAAC,KAAK;;MAAkB;IACxB,GAAG;;;;;;;;;;;;;;CACV"}
@@ -0,0 +1,7 @@
1
+ import { OpenXiangdaCommand, workspaceFlags } from '../base.js';
2
+ export default class Check extends OpenXiangdaCommand {
3
+ static summary = '确定性检查完整应用';
4
+ static flags = workspaceFlags;
5
+ async run() { const { flags } = await this.parse(Check); return this.present(await this.services.check(flags.cwd)); }
6
+ }
7
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAChE,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,kBAAkB;IACnD,MAAM,CAAC,OAAO,GAAG,WAAW,CAAC;IAC7B,MAAM,CAAC,KAAK,GAAG,cAAc,CAAC;IAC9B,KAAK,CAAC,GAAG,KAAK,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { OpenXiangdaCommand } from "../base.js";
2
+ export default class Create extends OpenXiangdaCommand {
3
+ static summary: string;
4
+ static args: {
5
+ directory: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
6
+ };
7
+ run(): Promise<import("openxiangda-contracts").DevkitResult<unknown> | {
8
+ schemaVersion: string;
9
+ ok: boolean;
10
+ operation: string;
11
+ workspace: import("openxiangda-contracts").WorkspaceIdentity;
12
+ data: {} | null;
13
+ error: {
14
+ code: string;
15
+ message: string;
16
+ retryable: boolean;
17
+ remediation: string;
18
+ nextCommand: string | null;
19
+ } | null;
20
+ }>;
21
+ private reuseWorkspace;
22
+ }
23
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAOhD,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,kBAAkB;IACpD,MAAM,CAAC,OAAO,SAAmC;IACjD,MAAM,CAAC,IAAI;;MAET;IAEI,GAAG;;;;;;;;;;;;;;YAkEK,cAAc;CAsB7B"}
@@ -0,0 +1,101 @@
1
+ import { Args } from "@oclif/core";
2
+ import { existsSync, readdirSync } from "node:fs";
3
+ import { basename, resolve } from "node:path";
4
+ import { OpenXiangdaDeveloperSession } from "openxiangda-devkit-core";
5
+ import { OpenXiangdaCommand } from "../base.js";
6
+ import { createWorkspace, prepareWorkspace, } from "../create-workspace.js";
7
+ export default class Create extends OpenXiangdaCommand {
8
+ static summary = "创建、绑定并幂等初始化 React + NestJS 应用";
9
+ static args = {
10
+ directory: Args.string({ required: true, summary: "应用目录" }),
11
+ };
12
+ async run() {
13
+ const { args } = await this.parse(Create);
14
+ const root = resolve(args.directory);
15
+ const directoryName = basename(root);
16
+ const appCode = deriveAppCode(directoryName);
17
+ const name = directoryName;
18
+ const installOutput = this.jsonEnabled()
19
+ ? "capture"
20
+ : "inherit";
21
+ const session = await OpenXiangdaDeveloperSession.load();
22
+ if (!session) {
23
+ throw new Error("OPENXIANGDA_AUTH_REQUIRED: 先运行 openxiangda login --base-url <platform>");
24
+ }
25
+ await session.whoami();
26
+ const reusable = existsSync(root) && readdirSync(root).length > 0;
27
+ const workspace = reusable
28
+ ? await this.reuseWorkspace(root, appCode, name, installOutput)
29
+ : await createWorkspace({
30
+ directory: root,
31
+ appCode,
32
+ name,
33
+ installOutput,
34
+ });
35
+ const link = await this.services.linkApplication(root, {
36
+ baseUrl: session.baseUrl,
37
+ });
38
+ if (!link.ok)
39
+ return this.present({ ...link, operation: "create" });
40
+ const provision = await this.services.provisionApplication(root);
41
+ if (!provision.ok) {
42
+ return this.present({
43
+ ...provision,
44
+ operation: "create",
45
+ nextActions: [
46
+ {
47
+ code: "create.retry",
48
+ label: "重试幂等初始化",
49
+ command: `openxiangda create ${root}`,
50
+ },
51
+ ],
52
+ });
53
+ }
54
+ return this.present({
55
+ ok: true,
56
+ operation: "create",
57
+ workspace: { appCode, name, root },
58
+ data: {
59
+ workspace,
60
+ link: link.data,
61
+ provision: provision.data,
62
+ },
63
+ diagnostics: [],
64
+ nextActions: [
65
+ {
66
+ code: "dev",
67
+ label: "启动连接开发",
68
+ command: `openxiangda dev --cwd ${root}`,
69
+ },
70
+ ],
71
+ });
72
+ }
73
+ async reuseWorkspace(root, appCode, name, installOutput) {
74
+ const context = await this.services.workspaceContext(root);
75
+ if (context.workspace.appCode !== appCode) {
76
+ throw new Error(`TARGET_DIRECTORY_APP_MISMATCH: 目录应用代码 ${context.workspace.appCode} 与推导值 ${appCode} 不一致`);
77
+ }
78
+ await prepareWorkspace(root, { installOutput });
79
+ return {
80
+ root,
81
+ appCode,
82
+ name: context.workspace.name || name,
83
+ installed: true,
84
+ generated: true,
85
+ reused: true,
86
+ };
87
+ }
88
+ }
89
+ function deriveAppCode(directoryName) {
90
+ const code = directoryName
91
+ .normalize("NFKD")
92
+ .toLowerCase()
93
+ .replace(/[^a-z0-9]+/g, "-")
94
+ .replace(/^-+|-+$/g, "")
95
+ .replace(/^[^a-z]+/, "");
96
+ if (!/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/.test(code)) {
97
+ throw new Error("APP_CODE_INVALID: 目录名必须能推导出以英文字母开头的 kebab-case 应用代码");
98
+ }
99
+ return code;
100
+ }
101
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { OpenXiangdaCommand } from "../base.js";
2
+ export default class Deploy extends OpenXiangdaCommand {
3
+ static summary: string;
4
+ static flags: {
5
+ environment: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
6
+ from: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
7
+ "environment-id": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
+ "idempotency-key": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ cwd: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
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=deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAkB,MAAM,YAAY,CAAC;AAChE,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,kBAAkB;IACpD,MAAM,CAAC,OAAO,SAA2B;IACzC,MAAM,CAAC,KAAK;;;;;;MAaV;IACI,GAAG;;;;;;;;;;;;;;CA8BV"}
@@ -0,0 +1,42 @@
1
+ import { Flags } from "@oclif/core";
2
+ import { OpenXiangdaCommand, workspaceFlags } from "../base.js";
3
+ export default class Deploy extends OpenXiangdaCommand {
4
+ static summary = "部署到测试环境,或显式复用测试版本部署生产";
5
+ static flags = {
6
+ ...workspaceFlags,
7
+ environment: Flags.string({
8
+ options: ["test", "production"],
9
+ default: "test",
10
+ summary: "目标环境;默认为 test",
11
+ }),
12
+ from: Flags.string({
13
+ summary: "生产部署复用的成功测试 DeploymentRun ID",
14
+ dependsOn: ["environment"],
15
+ }),
16
+ "environment-id": Flags.string(),
17
+ "idempotency-key": Flags.string(),
18
+ };
19
+ async run() {
20
+ const { flags } = await this.parse(Deploy);
21
+ if (flags.environment === "production") {
22
+ if (!flags.from) {
23
+ throw new Error("PRODUCTION_TEST_DEPLOYMENT_REQUIRED: 使用 --from <test-deployment-id> 复用已验证版本");
24
+ }
25
+ return this.present(await this.services.deployProduction(flags.cwd, flags.from));
26
+ }
27
+ if (flags.from) {
28
+ throw new Error("DEPLOY_TEST_FROM_INVALID: --from 只允许与 --environment production 一起使用");
29
+ }
30
+ return this.present(await this.services.deploy({
31
+ ...(flags.cwd ? { root: flags.cwd } : {}),
32
+ environment: "preproduction",
33
+ ...(flags["environment-id"]
34
+ ? { environmentId: flags["environment-id"] }
35
+ : {}),
36
+ ...(flags["idempotency-key"]
37
+ ? { idempotencyKey: flags["idempotency-key"] }
38
+ : {}),
39
+ }));
40
+ }
41
+ }
42
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.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,MAAO,SAAQ,kBAAkB;IACpD,MAAM,CAAC,OAAO,GAAG,uBAAuB,CAAC;IACzC,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,cAAc;QACjB,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC;YACxB,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC;YAC/B,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,eAAe;SACzB,CAAC;QACF,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;YACjB,OAAO,EAAE,8BAA8B;YACvC,SAAS,EAAE,CAAC,aAAa,CAAC;SAC3B,CAAC;QACF,gBAAgB,EAAE,KAAK,CAAC,MAAM,EAAE;QAChC,iBAAiB,EAAE,KAAK,CAAC,MAAM,EAAE;KAClC,CAAC;IACF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,KAAK,CAAC,WAAW,KAAK,YAAY,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC,OAAO,CACjB,MAAM,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAC5D,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,qEAAqE,CACtE,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CACjB,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YACzB,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzC,WAAW,EAAE,eAAe;YAC5B,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC;gBACzB,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,gBAAgB,CAAC,EAAE;gBAC5C,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC;gBAC1B,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,iBAAiB,CAAC,EAAE;gBAC9C,CAAC,CAAC,EAAE,CAAC;SACR,CAAC,CACH,CAAC;IACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { OpenXiangdaCommand } from '../base.js';
2
+ export default class Dev extends OpenXiangdaCommand {
3
+ static summary: string;
4
+ static flags: {
5
+ 'no-open': import("@oclif/core/interfaces").BooleanFlag<boolean>;
6
+ 'web-port': import("@oclif/core/interfaces").OptionFlag<number | undefined, 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=dev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAkB,MAAM,YAAY,CAAC;AAChE,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,kBAAkB;IACjD,MAAM,CAAC,OAAO,SAAuC;IACrD,MAAM,CAAC,KAAK;;;;MASV;IACI,GAAG;;;;;;;;;;;;;;CAcV"}
@@ -0,0 +1,28 @@
1
+ import { Flags } from '@oclif/core';
2
+ import { OpenXiangdaCommand, workspaceFlags } from '../base.js';
3
+ export default class Dev extends OpenXiangdaCommand {
4
+ static summary = '启动连接远端平台数据的本地 React 与 NestJS 开发会话';
5
+ static flags = {
6
+ ...workspaceFlags,
7
+ 'no-open': Flags.boolean({ summary: '就绪后不自动打开浏览器' }),
8
+ 'web-port': Flags.integer({
9
+ summary: '固定本地 Web 端口(自动化验证使用)',
10
+ min: 1,
11
+ max: 65535,
12
+ helpValue: '<port>',
13
+ }),
14
+ };
15
+ async run() {
16
+ const { flags } = await this.parse(Dev);
17
+ return this.present(await this.services.dev(flags.cwd, {
18
+ noOpen: flags['no-open'],
19
+ ...(flags['web-port'] === undefined
20
+ ? {}
21
+ : { webPort: flags['web-port'] }),
22
+ ...(this.jsonEnabled()
23
+ ? {}
24
+ : { onStatus: message => this.log(message) }),
25
+ }));
26
+ }
27
+ }
28
+ //# sourceMappingURL=dev.js.map