openxiangda-cli 2.0.0-alpha.12 → 2.0.0-alpha.122

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 (271) hide show
  1. package/README.md +13 -14
  2. package/bin/run.js +79 -1
  3. package/dist/base.d.ts +40 -5
  4. package/dist/base.d.ts.map +1 -1
  5. package/dist/base.js +123 -10
  6. package/dist/base.js.map +1 -1
  7. package/dist/commands/accept.d.ts +25 -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/cancel.d.ts +16 -1
  12. package/dist/commands/cancel.d.ts.map +1 -1
  13. package/dist/commands/cancel.js +1 -1
  14. package/dist/commands/cancel.js.map +1 -1
  15. package/dist/commands/check.d.ts +17 -1
  16. package/dist/commands/check.d.ts.map +1 -1
  17. package/dist/commands/check.js +15 -3
  18. package/dist/commands/check.js.map +1 -1
  19. package/dist/commands/create.d.ts +25 -0
  20. package/dist/commands/create.d.ts.map +1 -0
  21. package/dist/commands/create.js +101 -0
  22. package/dist/commands/create.js.map +1 -0
  23. package/dist/commands/deploy.d.ts +21 -8
  24. package/dist/commands/deploy.d.ts.map +1 -1
  25. package/dist/commands/deploy.js +29 -16
  26. package/dist/commands/deploy.js.map +1 -1
  27. package/dist/commands/dev.d.ts +18 -1
  28. package/dist/commands/dev.d.ts.map +1 -1
  29. package/dist/commands/dev.js +24 -3
  30. package/dist/commands/dev.js.map +1 -1
  31. package/dist/commands/login.d.ts +26 -0
  32. package/dist/commands/login.d.ts.map +1 -0
  33. package/dist/commands/login.js +73 -0
  34. package/dist/commands/login.js.map +1 -0
  35. package/dist/commands/logs.d.ts +17 -2
  36. package/dist/commands/logs.d.ts.map +1 -1
  37. package/dist/commands/logs.js +2 -2
  38. package/dist/commands/logs.js.map +1 -1
  39. package/dist/commands/retry.d.ts +16 -1
  40. package/dist/commands/retry.d.ts.map +1 -1
  41. package/dist/commands/retry.js +5 -2
  42. package/dist/commands/retry.js.map +1 -1
  43. package/dist/commands/rollback.d.ts +17 -4
  44. package/dist/commands/rollback.d.ts.map +1 -1
  45. package/dist/commands/rollback.js +11 -4
  46. package/dist/commands/rollback.js.map +1 -1
  47. package/dist/commands/skill.d.ts +28 -0
  48. package/dist/commands/skill.d.ts.map +1 -0
  49. package/dist/commands/skill.js +43 -0
  50. package/dist/commands/skill.js.map +1 -0
  51. package/dist/commands/spec.d.ts +36 -0
  52. package/dist/commands/spec.d.ts.map +1 -0
  53. package/dist/commands/spec.js +117 -0
  54. package/dist/commands/spec.js.map +1 -0
  55. package/dist/commands/start.d.ts +25 -0
  56. package/dist/commands/start.d.ts.map +1 -0
  57. package/dist/commands/start.js +18 -0
  58. package/dist/commands/start.js.map +1 -0
  59. package/dist/commands/status.d.ts +16 -1
  60. package/dist/commands/status.d.ts.map +1 -1
  61. package/dist/commands/status.js +1 -1
  62. package/dist/commands/status.js.map +1 -1
  63. package/dist/commands/stop.d.ts +25 -0
  64. package/dist/commands/stop.d.ts.map +1 -0
  65. package/dist/commands/stop.js +18 -0
  66. package/dist/commands/stop.js.map +1 -0
  67. package/dist/create-workspace.d.ts +31 -0
  68. package/dist/create-workspace.d.ts.map +1 -0
  69. package/dist/create-workspace.js +273 -0
  70. package/dist/create-workspace.js.map +1 -0
  71. package/dist/toolchain-capsule.d.ts +4 -0
  72. package/dist/toolchain-capsule.d.ts.map +1 -0
  73. package/dist/toolchain-capsule.js +116 -0
  74. package/dist/toolchain-capsule.js.map +1 -0
  75. package/package.json +16 -9
  76. package/template/.dockerignore +23 -0
  77. package/template/.env.example +3 -0
  78. package/template/AGENTS.md +25 -0
  79. package/template/README.md +43 -0
  80. package/template/_gitignore +14 -0
  81. package/template/apps/server/Dockerfile +20 -0
  82. package/template/apps/server/package.json +27 -0
  83. package/template/apps/server/src/app.module.ts +43 -0
  84. package/template/apps/server/src/main.ts +5 -0
  85. package/template/apps/server/test/smoke.test.ts +16 -0
  86. package/template/apps/server/tsconfig.json +9 -0
  87. package/template/apps/web/data-api-live.e2e.html +15 -0
  88. package/template/apps/web/e2e/client-fixture.ts +5 -0
  89. package/template/apps/web/e2e/data-api-live-fixture.tsx +162 -0
  90. package/template/apps/web/e2e/data-api-live.spec.ts +144 -0
  91. package/template/apps/web/e2e/field-protocol-fixture.tsx +347 -0
  92. package/template/apps/web/e2e/field-protocol.spec.ts +195 -0
  93. package/template/apps/web/e2e/resource-experience-fixture.tsx +415 -0
  94. package/template/apps/web/e2e/resources.spec.ts +578 -0
  95. package/template/apps/web/e2e/workflow-experience-fixture.tsx +144 -0
  96. package/template/apps/web/e2e/workflow.spec.ts +576 -0
  97. package/template/apps/web/field-protocol.e2e.html +15 -0
  98. package/template/apps/web/index.html +12 -0
  99. package/template/apps/web/package.json +32 -0
  100. package/template/apps/web/playwright.config.ts +47 -0
  101. package/template/apps/web/resource-experience.e2e.html +15 -0
  102. package/template/apps/web/scripts/check.mjs +43 -0
  103. package/template/apps/web/scripts/verify-build.mjs +6 -0
  104. package/template/apps/web/src/main.tsx +41 -0
  105. package/template/apps/web/test/contracts.test.ts +149 -0
  106. package/template/apps/web/test/loopback.test.ts +62 -0
  107. package/template/apps/web/tsconfig.json +12 -0
  108. package/template/apps/web/vite.config.ts +40 -0
  109. package/template/apps/web/workflow-experience.e2e.html +15 -0
  110. package/template/appspec/app.md +36 -0
  111. package/template/openxiangda.config.ts +34 -0
  112. package/template/package.json +28 -0
  113. package/template/packages/contracts/package.json +23 -0
  114. package/template/packages/contracts/src/generated.ts +135 -0
  115. package/template/packages/contracts/src/index.ts +1 -0
  116. package/template/packages/contracts/tsconfig.json +9 -0
  117. package/template/pnpm-workspace.yaml +7 -0
  118. package/template/scripts/verify-template-budget.mjs +49 -0
  119. package/template/tsconfig.base.json +13 -0
  120. package/dist/commands/app/create.d.ts +0 -15
  121. package/dist/commands/app/create.d.ts.map +0 -1
  122. package/dist/commands/app/create.js +0 -42
  123. package/dist/commands/app/create.js.map +0 -1
  124. package/dist/commands/app/info.d.ts +0 -9
  125. package/dist/commands/app/info.d.ts.map +0 -1
  126. package/dist/commands/app/info.js +0 -10
  127. package/dist/commands/app/info.js.map +0 -1
  128. package/dist/commands/app/link.d.ts +0 -10
  129. package/dist/commands/app/link.d.ts.map +0 -1
  130. package/dist/commands/app/link.js +0 -16
  131. package/dist/commands/app/link.js.map +0 -1
  132. package/dist/commands/app/provision.d.ts +0 -9
  133. package/dist/commands/app/provision.d.ts.map +0 -1
  134. package/dist/commands/app/provision.js +0 -10
  135. package/dist/commands/app/provision.js.map +0 -1
  136. package/dist/commands/auth/login.d.ts +0 -10
  137. package/dist/commands/auth/login.d.ts.map +0 -1
  138. package/dist/commands/auth/login.js +0 -34
  139. package/dist/commands/auth/login.js.map +0 -1
  140. package/dist/commands/auth/logout.d.ts +0 -6
  141. package/dist/commands/auth/logout.d.ts.map +0 -1
  142. package/dist/commands/auth/logout.js +0 -10
  143. package/dist/commands/auth/logout.js.map +0 -1
  144. package/dist/commands/auth/status.d.ts +0 -6
  145. package/dist/commands/auth/status.d.ts.map +0 -1
  146. package/dist/commands/auth/status.js +0 -19
  147. package/dist/commands/auth/status.js.map +0 -1
  148. package/dist/commands/build.d.ts +0 -11
  149. package/dist/commands/build.d.ts.map +0 -1
  150. package/dist/commands/build.js +0 -23
  151. package/dist/commands/build.js.map +0 -1
  152. package/dist/commands/doctor.d.ts +0 -9
  153. package/dist/commands/doctor.d.ts.map +0 -1
  154. package/dist/commands/doctor.js +0 -7
  155. package/dist/commands/doctor.js.map +0 -1
  156. package/dist/commands/event/delivery/list.d.ts +0 -10
  157. package/dist/commands/event/delivery/list.d.ts.map +0 -1
  158. package/dist/commands/event/delivery/list.js +0 -14
  159. package/dist/commands/event/delivery/list.js.map +0 -1
  160. package/dist/commands/event/delivery/replay.d.ts +0 -13
  161. package/dist/commands/event/delivery/replay.d.ts.map +0 -1
  162. package/dist/commands/event/delivery/replay.js +0 -16
  163. package/dist/commands/event/delivery/replay.js.map +0 -1
  164. package/dist/commands/event/subscription/list.d.ts +0 -9
  165. package/dist/commands/event/subscription/list.d.ts.map +0 -1
  166. package/dist/commands/event/subscription/list.js +0 -10
  167. package/dist/commands/event/subscription/list.js.map +0 -1
  168. package/dist/commands/event/subscription/rotate-secret.d.ts +0 -15
  169. package/dist/commands/event/subscription/rotate-secret.d.ts.map +0 -1
  170. package/dist/commands/event/subscription/rotate-secret.js +0 -33
  171. package/dist/commands/event/subscription/rotate-secret.js.map +0 -1
  172. package/dist/commands/event/subscription/status.d.ts +0 -14
  173. package/dist/commands/event/subscription/status.d.ts.map +0 -1
  174. package/dist/commands/event/subscription/status.js +0 -19
  175. package/dist/commands/event/subscription/status.js.map +0 -1
  176. package/dist/commands/event/timer/list.d.ts +0 -9
  177. package/dist/commands/event/timer/list.d.ts.map +0 -1
  178. package/dist/commands/event/timer/list.js +0 -10
  179. package/dist/commands/event/timer/list.js.map +0 -1
  180. package/dist/commands/event/timer/status.d.ts +0 -14
  181. package/dist/commands/event/timer/status.d.ts.map +0 -1
  182. package/dist/commands/event/timer/status.js +0 -19
  183. package/dist/commands/event/timer/status.js.map +0 -1
  184. package/dist/commands/generate.d.ts +0 -10
  185. package/dist/commands/generate.d.ts.map +0 -1
  186. package/dist/commands/generate.js +0 -8
  187. package/dist/commands/generate.js.map +0 -1
  188. package/dist/commands/oauth/audit/list.d.ts +0 -12
  189. package/dist/commands/oauth/audit/list.d.ts.map +0 -1
  190. package/dist/commands/oauth/audit/list.js +0 -20
  191. package/dist/commands/oauth/audit/list.js.map +0 -1
  192. package/dist/commands/oauth/client/create.d.ts +0 -13
  193. package/dist/commands/oauth/client/create.d.ts.map +0 -1
  194. package/dist/commands/oauth/client/create.js +0 -34
  195. package/dist/commands/oauth/client/create.js.map +0 -1
  196. package/dist/commands/oauth/client/list.d.ts +0 -9
  197. package/dist/commands/oauth/client/list.d.ts.map +0 -1
  198. package/dist/commands/oauth/client/list.js +0 -10
  199. package/dist/commands/oauth/client/list.js.map +0 -1
  200. package/dist/commands/oauth/client/revoke.d.ts +0 -12
  201. package/dist/commands/oauth/client/revoke.d.ts.map +0 -1
  202. package/dist/commands/oauth/client/revoke.js +0 -12
  203. package/dist/commands/oauth/client/revoke.js.map +0 -1
  204. package/dist/commands/oauth/client/rotate.d.ts +0 -13
  205. package/dist/commands/oauth/client/rotate.d.ts.map +0 -1
  206. package/dist/commands/oauth/client/rotate.js +0 -20
  207. package/dist/commands/oauth/client/rotate.js.map +0 -1
  208. package/dist/commands/oauth/client/update.d.ts +0 -15
  209. package/dist/commands/oauth/client/update.d.ts.map +0 -1
  210. package/dist/commands/oauth/client/update.js +0 -23
  211. package/dist/commands/oauth/client/update.js.map +0 -1
  212. package/dist/commands/oauth/runtime/rotate.d.ts +0 -12
  213. package/dist/commands/oauth/runtime/rotate.d.ts.map +0 -1
  214. package/dist/commands/oauth/runtime/rotate.js +0 -31
  215. package/dist/commands/oauth/runtime/rotate.js.map +0 -1
  216. package/dist/commands/oauth/runtime/status.d.ts +0 -10
  217. package/dist/commands/oauth/runtime/status.d.ts.map +0 -1
  218. package/dist/commands/oauth/runtime/status.js +0 -17
  219. package/dist/commands/oauth/runtime/status.js.map +0 -1
  220. package/dist/commands/promote.d.ts +0 -13
  221. package/dist/commands/promote.d.ts.map +0 -1
  222. package/dist/commands/promote.js +0 -9
  223. package/dist/commands/promote.js.map +0 -1
  224. package/dist/commands/secret/audit/list.d.ts +0 -14
  225. package/dist/commands/secret/audit/list.d.ts.map +0 -1
  226. package/dist/commands/secret/audit/list.js +0 -16
  227. package/dist/commands/secret/audit/list.js.map +0 -1
  228. package/dist/commands/secret/create.d.ts +0 -18
  229. package/dist/commands/secret/create.d.ts.map +0 -1
  230. package/dist/commands/secret/create.js +0 -33
  231. package/dist/commands/secret/create.js.map +0 -1
  232. package/dist/commands/secret/delete.d.ts +0 -15
  233. package/dist/commands/secret/delete.d.ts.map +0 -1
  234. package/dist/commands/secret/delete.js +0 -20
  235. package/dist/commands/secret/delete.js.map +0 -1
  236. package/dist/commands/secret/list.d.ts +0 -10
  237. package/dist/commands/secret/list.d.ts.map +0 -1
  238. package/dist/commands/secret/list.js +0 -14
  239. package/dist/commands/secret/list.js.map +0 -1
  240. package/dist/commands/secret/rotate.d.ts +0 -18
  241. package/dist/commands/secret/rotate.d.ts.map +0 -1
  242. package/dist/commands/secret/rotate.js +0 -30
  243. package/dist/commands/secret/rotate.js.map +0 -1
  244. package/dist/commands/secret/update.d.ts +0 -17
  245. package/dist/commands/secret/update.d.ts.map +0 -1
  246. package/dist/commands/secret/update.js +0 -37
  247. package/dist/commands/secret/update.js.map +0 -1
  248. package/dist/commands/skill/install.d.ts +0 -11
  249. package/dist/commands/skill/install.d.ts.map +0 -1
  250. package/dist/commands/skill/install.js +0 -52
  251. package/dist/commands/skill/install.js.map +0 -1
  252. package/dist/commands/skill/validate.d.ts +0 -9
  253. package/dist/commands/skill/validate.d.ts.map +0 -1
  254. package/dist/commands/skill/validate.js +0 -32
  255. package/dist/commands/skill/validate.js.map +0 -1
  256. package/dist/commands/test.d.ts +0 -9
  257. package/dist/commands/test.d.ts.map +0 -1
  258. package/dist/commands/test.js +0 -7
  259. package/dist/commands/test.js.map +0 -1
  260. package/dist/commands/workflow/provider/list.d.ts +0 -10
  261. package/dist/commands/workflow/provider/list.d.ts.map +0 -1
  262. package/dist/commands/workflow/provider/list.js +0 -14
  263. package/dist/commands/workflow/provider/list.js.map +0 -1
  264. package/dist/commands/workflow/provider/rotate.d.ts +0 -15
  265. package/dist/commands/workflow/provider/rotate.d.ts.map +0 -1
  266. package/dist/commands/workflow/provider/rotate.js +0 -24
  267. package/dist/commands/workflow/provider/rotate.js.map +0 -1
  268. package/dist/secret-value.d.ts +0 -5
  269. package/dist/secret-value.d.ts.map +0 -1
  270. package/dist/secret-value.js +0 -15
  271. package/dist/secret-value.js.map +0 -1
package/README.md CHANGED
@@ -1,17 +1,16 @@
1
1
  # openxiangda-cli
2
2
 
3
- The thin OpenXiangda 2.0 CLI exposes only application-level commands. Each
4
- command parses input, calls one `OpenXiangdaApplicationServices` use case and
5
- renders its `DevkitResult`; commands never invoke other commands or parse their
6
- stdout. React, Ant Design and editor runtimes are intentionally absent.
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.
7
4
 
8
- The CLI includes application creation, deterministic contract generation,
9
- checks/tests/build/deploy, OAuth2 client lifecycle, platform-managed runtime
10
- credential status/rotation, environment Secret management, event operations
11
- and staged Workflow Provider rotation. Runtime rotation stages a credential by
12
- CAS and promotes the currently active immutable AppVersion, so no secret is
13
- returned to the CLI and retries reuse one idempotency key. Secret
14
- values are read only from an environment variable or file and are never
15
- accepted as a command argument or rendered in output. A disposable application
16
- can use `app create --local-sdk <openxiangda-v2-root>` to test unpublished
17
- packages through pnpm link overrides.
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`, `aiCatalogDigest` and the typed copy-once
11
+ `adminNavigationAuthoring.suggestion`. Copy its expression into
12
+ `frontend.admin.navigation`; runtime never applies it automatically. This
13
+ transport does not add another executable and applications must not implement
14
+ a second MCP server.
15
+
16
+ `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 CHANGED
@@ -1,4 +1,82 @@
1
1
  #!/usr/bin/env node
2
2
  import { execute } from '@oclif/core';
3
+ import { readFileSync } from 'node:fs';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { DEVKIT_COMMANDS } from 'openxiangda-devkit-core';
3
6
 
4
- await execute({ dir: import.meta.url });
7
+ const publicCommands = new Set(DEVKIT_COMMANDS.map(command => command.id));
8
+ const args = process.argv.slice(2);
9
+
10
+ if (args.includes('--mcp-stdio')) {
11
+ const allowed = new Set(['--mcp-stdio', '--cwd']);
12
+ for (let index = 0; index < args.length; index += 1) {
13
+ const argument = args[index];
14
+ if (argument === '--cwd') {
15
+ index += 1;
16
+ if (!args[index]) throw new Error('OPENXIANGDA_MCP_CWD_REQUIRED');
17
+ continue;
18
+ }
19
+ if (!allowed.has(argument)) {
20
+ throw new Error(`OPENXIANGDA_MCP_ARGUMENT_INVALID: ${argument}`);
21
+ }
22
+ }
23
+ const cwdIndex = args.indexOf('--cwd');
24
+ const root = cwdIndex >= 0 ? args[cwdIndex + 1] : undefined;
25
+ const { runStdioServer } = await import('openxiangda-mcp');
26
+ await runStdioServer(root ? { root } : {});
27
+ } else {
28
+ const command = args.find(argument => !argument.startsWith('-'));
29
+
30
+ if (command && !publicCommands.has(command)) {
31
+ const nextCommand = 'openxiangda --help';
32
+ if (args.includes('--json')) {
33
+ process.stdout.write(`${JSON.stringify({
34
+ schemaVersion: 'openxiangda.cli-result/v2',
35
+ ok: false,
36
+ operation: command,
37
+ workspace: null,
38
+ data: null,
39
+ error: {
40
+ code: 'OPENXIANGDA_COMMAND_NOT_FOUND',
41
+ message: `未知命令: ${command}`,
42
+ retryable: false,
43
+ remediation: `运行 ${nextCommand}`,
44
+ nextCommand,
45
+ },
46
+ })}\n`);
47
+ } else {
48
+ process.stderr.write(`未知命令: ${command}\n运行 ${nextCommand}\n`);
49
+ }
50
+ process.exitCode = 2;
51
+ } else {
52
+ const root = fileURLToPath(new URL('../', import.meta.url));
53
+ const cliManifest = JSON.parse(
54
+ readFileSync(new URL('../package.json', import.meta.url), 'utf8')
55
+ );
56
+ const distributionManifest = process.env.OPENXIANGDA_DISTRIBUTION_NAME
57
+ ? {
58
+ ...cliManifest,
59
+ name: process.env.OPENXIANGDA_DISTRIBUTION_NAME,
60
+ version:
61
+ process.env.OPENXIANGDA_DISTRIBUTION_VERSION ||
62
+ cliManifest.version,
63
+ }
64
+ : undefined;
65
+ await execute({
66
+ args,
67
+ loadOptions: {
68
+ root,
69
+ ...(distributionManifest ? { pjson: distributionManifest } : {}),
70
+ ...(process.env.OPENXIANGDA_DISTRIBUTION_NAME
71
+ ? { name: process.env.OPENXIANGDA_DISTRIBUTION_NAME }
72
+ : {}),
73
+ ...(process.env.OPENXIANGDA_DISTRIBUTION_VERSION
74
+ ? { version: process.env.OPENXIANGDA_DISTRIBUTION_VERSION }
75
+ : {}),
76
+ userPlugins: false,
77
+ devPlugins: false,
78
+ jitPlugins: false,
79
+ },
80
+ });
81
+ }
82
+ }
package/dist/base.d.ts CHANGED
@@ -1,13 +1,48 @@
1
- import { Command } from '@oclif/core';
2
- import type { DevkitResult } from 'openxiangda-contracts';
3
- import { OpenXiangdaApplicationServices } from 'openxiangda-devkit-core';
1
+ import { Command } from "@oclif/core";
2
+ import type { DevkitResult } from "openxiangda-contracts";
3
+ import { OpenXiangdaApplicationServices } from "openxiangda-devkit-core";
4
4
  export declare const workspaceFlags: {
5
5
  cwd: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
6
6
  };
7
- export declare const backendImageFlag: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
7
  export declare abstract class OpenXiangdaCommand extends Command {
9
8
  static enableJsonFlag: boolean;
10
9
  protected readonly services: OpenXiangdaApplicationServices;
11
- protected present(result: DevkitResult<unknown>): DevkitResult<unknown>;
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
+ details?: Record<string, unknown>;
21
+ pointer?: string;
22
+ code: string;
23
+ message: string;
24
+ retryable: boolean;
25
+ remediation: string;
26
+ nextCommand: string | null;
27
+ } | null;
28
+ };
29
+ protected toErrorJson(error: unknown): {
30
+ schemaVersion: string;
31
+ ok: boolean;
32
+ operation: string;
33
+ workspace: null;
34
+ data: null;
35
+ error: {
36
+ details?: Record<string, unknown>;
37
+ pointer?: string;
38
+ code: string;
39
+ message: string;
40
+ retryable: boolean;
41
+ remediation: string;
42
+ nextCommand: string;
43
+ };
44
+ };
45
+ private envelope;
46
+ private errorNextCommand;
12
47
  }
13
48
  //# sourceMappingURL=base.d.ts.map
@@ -1 +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;AAEzE,eAAO,MAAM,cAAc;;CAE1B,CAAC;AAEF,eAAO,MAAM,gBAAgB,iHAI3B,CAAC;AAEH,8BAAsB,kBAAmB,SAAQ,OAAO;IACtD,MAAM,CAAC,cAAc,UAAQ;IAE7B,SAAS,CAAC,QAAQ,CAAC,QAAQ,iCAAwC;IAEnE,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC;CAYhD"}
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;;;;;;;;;;;;;;;;IAqDpC,OAAO,CAAC,QAAQ;IA2BhB,OAAO,CAAC,gBAAgB;CAoCzB"}
package/dist/base.js CHANGED
@@ -1,20 +1,28 @@
1
- import { Command, Flags } from '@oclif/core';
2
- import { OpenXiangdaApplicationServices } from 'openxiangda-devkit-core';
1
+ import { Command, Flags } from "@oclif/core";
2
+ import { OpenXiangdaApplicationServices } from "openxiangda-devkit-core";
3
+ import { resolveCliToolchainCapsule } from "./toolchain-capsule.js";
3
4
  export const workspaceFlags = {
4
- cwd: Flags.string({ summary: '应用工作区目录', helpValue: '<directory>' }),
5
+ cwd: Flags.string({ summary: "应用工作区目录", helpValue: "<directory>" }),
5
6
  };
6
- export const backendImageFlag = Flags.string({
7
- summary: '已经推送的不可变后端 OCI image',
8
- helpValue: '<registry/repository@sha256:digest>',
9
- env: 'OPENXIANGDA_BACKEND_IMAGE',
10
- });
11
7
  export class OpenXiangdaCommand extends Command {
12
8
  static enableJsonFlag = true;
13
- services = new OpenXiangdaApplicationServices();
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
+ }
14
20
  present(result) {
15
21
  if (!result.ok)
16
22
  process.exitCode = 1;
17
- this.log(`${result.ok ? '✓' : '✗'} ${result.operation}`);
23
+ if (this.jsonEnabled())
24
+ return this.envelope(result);
25
+ this.log(`${result.ok ? "✓" : "✗"} ${result.operation}`);
18
26
  for (const diagnostic of result.diagnostics) {
19
27
  this.log(` ${diagnostic.code}: ${diagnostic.message}`);
20
28
  if (diagnostic.remediation)
@@ -25,5 +33,110 @@ export class OpenXiangdaCommand extends Command {
25
33
  }
26
34
  return result;
27
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
+ const details = error?.data &&
50
+ typeof error.data === "object" &&
51
+ !Array.isArray(error.data)
52
+ ? (error.data)
53
+ : undefined;
54
+ const pointer = (details && typeof details.pointer === "string"
55
+ ? details.pointer
56
+ : undefined) ||
57
+ error?.remote?.path;
58
+ return {
59
+ schemaVersion: "openxiangda.cli-result/v2",
60
+ ok: false,
61
+ operation: this.id || "unknown",
62
+ workspace: null,
63
+ data: null,
64
+ error: {
65
+ code,
66
+ message: message.replace(/^([A-Z][A-Z0-9_]+):\s*/, ""),
67
+ retryable,
68
+ remediation: typeof declaredRemediation === "string"
69
+ ? declaredRemediation
70
+ : `运行 ${nextCommand}`,
71
+ nextCommand,
72
+ ...(pointer ? { pointer } : {}),
73
+ ...(details ? { details } : {}),
74
+ },
75
+ };
76
+ }
77
+ envelope(result) {
78
+ const diagnostic = result.diagnostics.find(item => item.severity === "error");
79
+ const nextCommand = result.nextActions.find(action => action.command?.startsWith("openxiangda "))
80
+ ?.command || (diagnostic ? this.errorNextCommand(diagnostic.code) : null);
81
+ return {
82
+ schemaVersion: "openxiangda.cli-result/v2",
83
+ ok: result.ok,
84
+ operation: result.operation,
85
+ workspace: result.workspace,
86
+ data: result.data ?? null,
87
+ error: diagnostic
88
+ ? {
89
+ code: diagnostic.code,
90
+ message: diagnostic.message,
91
+ retryable: diagnostic.retryable,
92
+ remediation: diagnostic.remediation ||
93
+ (nextCommand ? `运行 ${nextCommand}` : "检查错误后重试"),
94
+ nextCommand,
95
+ ...(diagnostic.path ? { pointer: diagnostic.path } : {}),
96
+ ...(diagnostic.details ? { details: diagnostic.details } : {}),
97
+ }
98
+ : null,
99
+ };
100
+ }
101
+ errorNextCommand(code) {
102
+ if (/AUTH|LOGIN|SESSION|TOKEN/.test(code)) {
103
+ return "openxiangda login --base-url <platform>";
104
+ }
105
+ if (/PRODUCTION|PROMOTION/.test(code)) {
106
+ return "openxiangda deploy --environment production --from <test-deployment-id>";
107
+ }
108
+ if (code === "DELIVERY_RUN_ALREADY_ACTIVE") {
109
+ return "openxiangda status";
110
+ }
111
+ const currentCommand = {
112
+ create: "openxiangda create <directory>",
113
+ dev: "openxiangda dev",
114
+ check: "openxiangda check",
115
+ accept: "openxiangda accept --plan <file>",
116
+ deploy: "openxiangda deploy",
117
+ status: "openxiangda status",
118
+ logs: "openxiangda logs",
119
+ cancel: "openxiangda cancel <deployment-id>",
120
+ retry: "openxiangda retry <deployment-id>",
121
+ start: "openxiangda start",
122
+ stop: "openxiangda stop",
123
+ rollback: "openxiangda rollback --to <app-version-id>",
124
+ login: "openxiangda login --base-url <platform>",
125
+ spec: "openxiangda spec context --json",
126
+ };
127
+ const currentId = this.id;
128
+ if (currentId && currentCommand[currentId])
129
+ return currentCommand[currentId];
130
+ if (/LINK|WORKSPACE|APP_CODE|APP_NAME|TARGET_DIRECTORY/.test(code)) {
131
+ return "openxiangda create <directory>";
132
+ }
133
+ if (/DEPLOYMENT|STATUS|LOG/.test(code))
134
+ return "openxiangda status";
135
+ if (/APPSPEC/.test(code))
136
+ return "openxiangda spec check";
137
+ if (/DEV/.test(code))
138
+ return "openxiangda dev";
139
+ return "openxiangda check";
140
+ }
28
141
  }
29
142
  //# sourceMappingURL=base.js.map
package/dist/base.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AAEzE,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;CACpE,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3C,OAAO,EAAE,sBAAsB;IAC/B,SAAS,EAAE,qCAAqC;IAChD,GAAG,EAAE,2BAA2B;CACjC,CAAC,CAAC;AAEH,MAAM,OAAgB,kBAAmB,SAAQ,OAAO;IACtD,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;IAEV,QAAQ,GAAG,IAAI,8BAA8B,EAAE,CAAC;IAEzD,OAAO,CAAC,MAA6B;QAC7C,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QACzD,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YAC5C,IAAI,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,IAAI,KAAK,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;YACxD,IAAI,UAAU,CAAC,WAAW;gBAAE,IAAI,CAAC,GAAG,CAAC,OAAO,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC"}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
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
+ details?: Record<string, unknown>;
16
+ pointer?: string;
17
+ code: string;
18
+ message: string;
19
+ retryable: boolean;
20
+ remediation: string;
21
+ nextCommand: string | null;
22
+ } | null;
23
+ }>;
24
+ }
25
+ //# 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"}
@@ -7,6 +7,21 @@ export default class Cancel extends OpenXiangdaCommand {
7
7
  static flags: {
8
8
  cwd: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
9
  };
10
- run(): Promise<import("openxiangda-contracts").DevkitResult<unknown>>;
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
+ details?: Record<string, unknown>;
18
+ pointer?: string;
19
+ code: string;
20
+ message: string;
21
+ retryable: boolean;
22
+ remediation: string;
23
+ nextCommand: string | null;
24
+ } | null;
25
+ }>;
11
26
  }
12
27
  //# sourceMappingURL=cancel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cancel.d.ts","sourceRoot":"","sources":["../../src/commands/cancel.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAkB,MAAM,YAAY,CAAC;AAEhE,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,kBAAkB;IACpD,MAAM,CAAC,OAAO,SAAwB;IACtC,MAAM,CAAC,IAAI;;MAAqD;IAChE,MAAM,CAAC,KAAK;;MAAkB;IAExB,GAAG;CAMV"}
1
+ {"version":3,"file":"cancel.d.ts","sourceRoot":"","sources":["../../src/commands/cancel.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAkB,MAAM,YAAY,CAAC;AAEhE,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,kBAAkB;IACpD,MAAM,CAAC,OAAO,SAA+B;IAC7C,MAAM,CAAC,IAAI;;MAAqD;IAChE,MAAM,CAAC,KAAK;;MAAkB;IAExB,GAAG;;;;;;;;;;;;;;;;CAMV"}
@@ -1,7 +1,7 @@
1
1
  import { Args } from '@oclif/core';
2
2
  import { OpenXiangdaCommand, workspaceFlags } from '../base.js';
3
3
  export default class Cancel extends OpenXiangdaCommand {
4
- static summary = '幂等取消 DeploymentRun';
4
+ static summary = '幂等取消尚未提交激活的 DeploymentRun';
5
5
  static args = { deploymentId: Args.string({ required: true }) };
6
6
  static flags = workspaceFlags;
7
7
  async run() {
@@ -1 +1 @@
1
- {"version":3,"file":"cancel.js","sourceRoot":"","sources":["../../src/commands/cancel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,kBAAkB;IACpD,MAAM,CAAC,OAAO,GAAG,oBAAoB,CAAC;IACtC,MAAM,CAAC,IAAI,GAAG,EAAE,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAChE,MAAM,CAAC,KAAK,GAAG,cAAc,CAAC;IAE9B,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,OAAO,CACjB,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,CACzD,CAAC;IACJ,CAAC"}
1
+ {"version":3,"file":"cancel.js","sourceRoot":"","sources":["../../src/commands/cancel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,kBAAkB;IACpD,MAAM,CAAC,OAAO,GAAG,2BAA2B,CAAC;IAC7C,MAAM,CAAC,IAAI,GAAG,EAAE,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAChE,MAAM,CAAC,KAAK,GAAG,cAAc,CAAC;IAE9B,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,OAAO,CACjB,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,CACzD,CAAC;IACJ,CAAC"}
@@ -2,8 +2,24 @@ import { OpenXiangdaCommand } from '../base.js';
2
2
  export default class Check extends OpenXiangdaCommand {
3
3
  static summary: string;
4
4
  static flags: {
5
+ environment: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
5
6
  cwd: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
6
7
  };
7
- run(): Promise<import("openxiangda-contracts").DevkitResult<unknown>>;
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
+ details?: Record<string, unknown>;
16
+ pointer?: string;
17
+ code: string;
18
+ message: string;
19
+ retryable: boolean;
20
+ remediation: string;
21
+ nextCommand: string | null;
22
+ } | null;
23
+ }>;
8
24
  }
9
25
  //# sourceMappingURL=check.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAkB,MAAM,YAAY,CAAC;AAEhE,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,kBAAkB;IACnD,MAAM,CAAC,OAAO,SAAqB;IACnC,MAAM,CAAC,KAAK;;;MAOV;IAEI,GAAG;;;;;;;;;;;;;;;;CAMV"}
@@ -1,7 +1,19 @@
1
+ import { Flags } from '@oclif/core';
1
2
  import { OpenXiangdaCommand, workspaceFlags } from '../base.js';
2
3
  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)); }
4
+ static summary = '针对目标平台确定性检查完整应用';
5
+ static flags = {
6
+ ...workspaceFlags,
7
+ environment: Flags.string({
8
+ options: ['test', 'production'],
9
+ default: 'test',
10
+ summary: '兼容性预检目标;默认为 test',
11
+ }),
12
+ };
13
+ async run() {
14
+ const { flags } = await this.parse(Check);
15
+ const environment = flags.environment === 'production' ? 'production' : 'preproduction';
16
+ return this.present(await this.services.check(flags.cwd, environment));
17
+ }
6
18
  }
7
19
  //# sourceMappingURL=check.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.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,KAAM,SAAQ,kBAAkB;IACnD,MAAM,CAAC,OAAO,GAAG,iBAAiB,CAAC;IACnC,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,kBAAkB;SAC5B,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,WAAW,GACf,KAAK,CAAC,WAAW,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC;QACtE,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;IACzE,CAAC"}
@@ -0,0 +1,25 @@
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
+ details?: Record<string, unknown>;
15
+ pointer?: string;
16
+ code: string;
17
+ message: string;
18
+ retryable: boolean;
19
+ remediation: string;
20
+ nextCommand: string | null;
21
+ } | null;
22
+ }>;
23
+ private reuseWorkspace;
24
+ }
25
+ //# 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