openxiangda-cli 2.0.0-alpha.18 → 2.0.0-alpha.182

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 (293) hide show
  1. package/README.md +6 -14
  2. package/bin/run.js +79 -1
  3. package/dist/base.d.ts +60 -5
  4. package/dist/base.d.ts.map +1 -1
  5. package/dist/base.js +197 -10
  6. package/dist/base.js.map +1 -1
  7. package/dist/commands/accept.d.ts +28 -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/admin.d.ts +32 -0
  12. package/dist/commands/admin.d.ts.map +1 -0
  13. package/dist/commands/admin.js +25 -0
  14. package/dist/commands/admin.js.map +1 -0
  15. package/dist/commands/cancel.d.ts +19 -1
  16. package/dist/commands/cancel.d.ts.map +1 -1
  17. package/dist/commands/cancel.js +1 -1
  18. package/dist/commands/cancel.js.map +1 -1
  19. package/dist/commands/check.d.ts +23 -1
  20. package/dist/commands/check.d.ts.map +1 -1
  21. package/dist/commands/check.js +21 -4
  22. package/dist/commands/check.js.map +1 -1
  23. package/dist/commands/context.d.ts +27 -0
  24. package/dist/commands/context.d.ts.map +1 -0
  25. package/dist/commands/context.js +10 -0
  26. package/dist/commands/context.js.map +1 -0
  27. package/dist/commands/create.d.ts +39 -0
  28. package/dist/commands/create.d.ts.map +1 -0
  29. package/dist/commands/create.js +457 -0
  30. package/dist/commands/create.js.map +1 -0
  31. package/dist/commands/deploy.d.ts +28 -8
  32. package/dist/commands/deploy.d.ts.map +1 -1
  33. package/dist/commands/deploy.js +30 -18
  34. package/dist/commands/deploy.js.map +1 -1
  35. package/dist/commands/dev.d.ts +23 -1
  36. package/dist/commands/dev.d.ts.map +1 -1
  37. package/dist/commands/dev.js +28 -4
  38. package/dist/commands/dev.js.map +1 -1
  39. package/dist/commands/docs.d.ts +30 -0
  40. package/dist/commands/docs.d.ts.map +1 -0
  41. package/dist/commands/docs.js +20 -0
  42. package/dist/commands/docs.js.map +1 -0
  43. package/dist/commands/login.d.ts +29 -0
  44. package/dist/commands/login.d.ts.map +1 -0
  45. package/dist/commands/{auth/login.js → login.js} +27 -9
  46. package/dist/commands/login.js.map +1 -0
  47. package/dist/commands/logs.d.ts +22 -2
  48. package/dist/commands/logs.d.ts.map +1 -1
  49. package/dist/commands/logs.js +9 -5
  50. package/dist/commands/logs.js.map +1 -1
  51. package/dist/commands/retry.d.ts +19 -1
  52. package/dist/commands/retry.d.ts.map +1 -1
  53. package/dist/commands/retry.js +5 -2
  54. package/dist/commands/retry.js.map +1 -1
  55. package/dist/commands/rollback.d.ts +23 -4
  56. package/dist/commands/rollback.d.ts.map +1 -1
  57. package/dist/commands/rollback.js +18 -5
  58. package/dist/commands/rollback.js.map +1 -1
  59. package/dist/commands/skill.d.ts +32 -0
  60. package/dist/commands/skill.d.ts.map +1 -0
  61. package/dist/commands/skill.js +50 -0
  62. package/dist/commands/skill.js.map +1 -0
  63. package/dist/commands/spec.d.ts +42 -0
  64. package/dist/commands/spec.d.ts.map +1 -0
  65. package/dist/commands/spec.js +123 -0
  66. package/dist/commands/spec.js.map +1 -0
  67. package/dist/commands/start.d.ts +28 -0
  68. package/dist/commands/start.d.ts.map +1 -0
  69. package/dist/commands/start.js +18 -0
  70. package/dist/commands/start.js.map +1 -0
  71. package/dist/commands/status.d.ts +20 -1
  72. package/dist/commands/status.d.ts.map +1 -1
  73. package/dist/commands/status.js +11 -4
  74. package/dist/commands/status.js.map +1 -1
  75. package/dist/commands/stop.d.ts +28 -0
  76. package/dist/commands/stop.d.ts.map +1 -0
  77. package/dist/commands/stop.js +18 -0
  78. package/dist/commands/stop.js.map +1 -0
  79. package/dist/create-workspace.d.ts +67 -0
  80. package/dist/create-workspace.d.ts.map +1 -0
  81. package/dist/create-workspace.js +631 -0
  82. package/dist/create-workspace.js.map +1 -0
  83. package/dist/studio-events.d.ts +9 -0
  84. package/dist/studio-events.d.ts.map +1 -0
  85. package/dist/studio-events.js +30 -0
  86. package/dist/studio-events.js.map +1 -0
  87. package/dist/toolchain-capsule.d.ts +4 -0
  88. package/dist/toolchain-capsule.d.ts.map +1 -0
  89. package/dist/toolchain-capsule.js +116 -0
  90. package/dist/toolchain-capsule.js.map +1 -0
  91. package/package.json +17 -10
  92. package/template/.dockerignore +23 -0
  93. package/template/.env.example +3 -0
  94. package/template/AGENTS.md +26 -0
  95. package/template/README.md +45 -0
  96. package/template/_gitignore +14 -0
  97. package/template/apps/web/data-api-live.e2e.html +15 -0
  98. package/template/apps/web/e2e/client-fixture.ts +5 -0
  99. package/template/apps/web/e2e/component-defaults-fixture.css +15 -0
  100. package/template/apps/web/e2e/data-api-live-fixture.tsx +162 -0
  101. package/template/apps/web/e2e/data-api-live.spec.ts +144 -0
  102. package/template/apps/web/e2e/field-protocol-fixture.tsx +387 -0
  103. package/template/apps/web/e2e/field-protocol.spec.ts +285 -0
  104. package/template/apps/web/e2e/mobile-files.spec.ts +96 -0
  105. package/template/apps/web/e2e/mobile-reference-fixture.tsx +314 -0
  106. package/template/apps/web/e2e/mobile-reference.spec.ts +360 -0
  107. package/template/apps/web/e2e/mobile-selection.spec.ts +199 -0
  108. package/template/apps/web/e2e/resource-experience-fixture.tsx +491 -0
  109. package/template/apps/web/e2e/resource-platform-mock.ts +202 -0
  110. package/template/apps/web/e2e/resources.spec.ts +488 -0
  111. package/template/apps/web/e2e/standard-admin.spec.ts +511 -0
  112. package/template/apps/web/e2e/workflow-entry-fixture.tsx +107 -0
  113. package/template/apps/web/e2e/workflow-entry.spec.ts +556 -0
  114. package/template/apps/web/e2e/workflow-experience-fixture.tsx +338 -0
  115. package/template/apps/web/e2e/workflow.spec.ts +1265 -0
  116. package/template/apps/web/field-protocol.e2e.html +22 -0
  117. package/template/apps/web/index.html +12 -0
  118. package/template/apps/web/mobile-reference.e2e.html +27 -0
  119. package/template/apps/web/package.json +34 -0
  120. package/template/apps/web/playwright.config.ts +47 -0
  121. package/template/apps/web/resource-experience.e2e.html +16 -0
  122. package/template/apps/web/scripts/check.mjs +43 -0
  123. package/template/apps/web/scripts/verify-build.mjs +6 -0
  124. package/template/apps/web/src/document.css +5 -0
  125. package/template/apps/web/src/main.tsx +66 -0
  126. package/template/apps/web/src/user-end/tailwind.css +5 -0
  127. package/template/apps/web/test/contracts.test.ts +163 -0
  128. package/template/apps/web/test/loopback.test.ts +68 -0
  129. package/template/apps/web/test/standard-user-surfaces.typecheck.tsx +27 -0
  130. package/template/apps/web/tsconfig.json +12 -0
  131. package/template/apps/web/vite.config.ts +43 -0
  132. package/template/apps/web/workflow-entry.e2e.html +15 -0
  133. package/template/apps/web/workflow-experience.e2e.html +15 -0
  134. package/template/appspec/app.md +52 -0
  135. package/template/openxiangda.config.ts +55 -0
  136. package/template/package.json +28 -0
  137. package/template/packages/contracts/package.json +23 -0
  138. package/template/packages/contracts/src/generated.ts +265 -0
  139. package/template/packages/contracts/src/index.ts +1 -0
  140. package/template/packages/contracts/tsconfig.json +9 -0
  141. package/template/pnpm-workspace.yaml +7 -0
  142. package/template/tsconfig.base.json +13 -0
  143. package/dist/commands/app/create.d.ts +0 -15
  144. package/dist/commands/app/create.d.ts.map +0 -1
  145. package/dist/commands/app/create.js +0 -42
  146. package/dist/commands/app/create.js.map +0 -1
  147. package/dist/commands/app/info.d.ts +0 -9
  148. package/dist/commands/app/info.d.ts.map +0 -1
  149. package/dist/commands/app/info.js +0 -10
  150. package/dist/commands/app/info.js.map +0 -1
  151. package/dist/commands/app/link.d.ts +0 -10
  152. package/dist/commands/app/link.d.ts.map +0 -1
  153. package/dist/commands/app/link.js +0 -16
  154. package/dist/commands/app/link.js.map +0 -1
  155. package/dist/commands/app/provision.d.ts +0 -9
  156. package/dist/commands/app/provision.d.ts.map +0 -1
  157. package/dist/commands/app/provision.js +0 -10
  158. package/dist/commands/app/provision.js.map +0 -1
  159. package/dist/commands/auth/login.d.ts +0 -11
  160. package/dist/commands/auth/login.d.ts.map +0 -1
  161. package/dist/commands/auth/login.js.map +0 -1
  162. package/dist/commands/auth/logout.d.ts +0 -6
  163. package/dist/commands/auth/logout.d.ts.map +0 -1
  164. package/dist/commands/auth/logout.js +0 -30
  165. package/dist/commands/auth/logout.js.map +0 -1
  166. package/dist/commands/auth/status.d.ts +0 -6
  167. package/dist/commands/auth/status.d.ts.map +0 -1
  168. package/dist/commands/auth/status.js +0 -60
  169. package/dist/commands/auth/status.js.map +0 -1
  170. package/dist/commands/build.d.ts +0 -11
  171. package/dist/commands/build.d.ts.map +0 -1
  172. package/dist/commands/build.js +0 -23
  173. package/dist/commands/build.js.map +0 -1
  174. package/dist/commands/doctor.d.ts +0 -9
  175. package/dist/commands/doctor.d.ts.map +0 -1
  176. package/dist/commands/doctor.js +0 -7
  177. package/dist/commands/doctor.js.map +0 -1
  178. package/dist/commands/event/delivery/list.d.ts +0 -10
  179. package/dist/commands/event/delivery/list.d.ts.map +0 -1
  180. package/dist/commands/event/delivery/list.js +0 -14
  181. package/dist/commands/event/delivery/list.js.map +0 -1
  182. package/dist/commands/event/delivery/replay.d.ts +0 -13
  183. package/dist/commands/event/delivery/replay.d.ts.map +0 -1
  184. package/dist/commands/event/delivery/replay.js +0 -16
  185. package/dist/commands/event/delivery/replay.js.map +0 -1
  186. package/dist/commands/event/subscription/list.d.ts +0 -9
  187. package/dist/commands/event/subscription/list.d.ts.map +0 -1
  188. package/dist/commands/event/subscription/list.js +0 -10
  189. package/dist/commands/event/subscription/list.js.map +0 -1
  190. package/dist/commands/event/subscription/rotate-secret.d.ts +0 -15
  191. package/dist/commands/event/subscription/rotate-secret.d.ts.map +0 -1
  192. package/dist/commands/event/subscription/rotate-secret.js +0 -33
  193. package/dist/commands/event/subscription/rotate-secret.js.map +0 -1
  194. package/dist/commands/event/subscription/status.d.ts +0 -14
  195. package/dist/commands/event/subscription/status.d.ts.map +0 -1
  196. package/dist/commands/event/subscription/status.js +0 -19
  197. package/dist/commands/event/subscription/status.js.map +0 -1
  198. package/dist/commands/event/timer/list.d.ts +0 -9
  199. package/dist/commands/event/timer/list.d.ts.map +0 -1
  200. package/dist/commands/event/timer/list.js +0 -10
  201. package/dist/commands/event/timer/list.js.map +0 -1
  202. package/dist/commands/event/timer/status.d.ts +0 -14
  203. package/dist/commands/event/timer/status.d.ts.map +0 -1
  204. package/dist/commands/event/timer/status.js +0 -19
  205. package/dist/commands/event/timer/status.js.map +0 -1
  206. package/dist/commands/generate.d.ts +0 -10
  207. package/dist/commands/generate.d.ts.map +0 -1
  208. package/dist/commands/generate.js +0 -8
  209. package/dist/commands/generate.js.map +0 -1
  210. package/dist/commands/oauth/audit/list.d.ts +0 -12
  211. package/dist/commands/oauth/audit/list.d.ts.map +0 -1
  212. package/dist/commands/oauth/audit/list.js +0 -20
  213. package/dist/commands/oauth/audit/list.js.map +0 -1
  214. package/dist/commands/oauth/client/create.d.ts +0 -13
  215. package/dist/commands/oauth/client/create.d.ts.map +0 -1
  216. package/dist/commands/oauth/client/create.js +0 -34
  217. package/dist/commands/oauth/client/create.js.map +0 -1
  218. package/dist/commands/oauth/client/list.d.ts +0 -9
  219. package/dist/commands/oauth/client/list.d.ts.map +0 -1
  220. package/dist/commands/oauth/client/list.js +0 -10
  221. package/dist/commands/oauth/client/list.js.map +0 -1
  222. package/dist/commands/oauth/client/revoke.d.ts +0 -12
  223. package/dist/commands/oauth/client/revoke.d.ts.map +0 -1
  224. package/dist/commands/oauth/client/revoke.js +0 -12
  225. package/dist/commands/oauth/client/revoke.js.map +0 -1
  226. package/dist/commands/oauth/client/rotate.d.ts +0 -13
  227. package/dist/commands/oauth/client/rotate.d.ts.map +0 -1
  228. package/dist/commands/oauth/client/rotate.js +0 -20
  229. package/dist/commands/oauth/client/rotate.js.map +0 -1
  230. package/dist/commands/oauth/client/update.d.ts +0 -15
  231. package/dist/commands/oauth/client/update.d.ts.map +0 -1
  232. package/dist/commands/oauth/client/update.js +0 -23
  233. package/dist/commands/oauth/client/update.js.map +0 -1
  234. package/dist/commands/oauth/runtime/rotate.d.ts +0 -12
  235. package/dist/commands/oauth/runtime/rotate.d.ts.map +0 -1
  236. package/dist/commands/oauth/runtime/rotate.js +0 -31
  237. package/dist/commands/oauth/runtime/rotate.js.map +0 -1
  238. package/dist/commands/oauth/runtime/status.d.ts +0 -10
  239. package/dist/commands/oauth/runtime/status.d.ts.map +0 -1
  240. package/dist/commands/oauth/runtime/status.js +0 -17
  241. package/dist/commands/oauth/runtime/status.js.map +0 -1
  242. package/dist/commands/promote.d.ts +0 -13
  243. package/dist/commands/promote.d.ts.map +0 -1
  244. package/dist/commands/promote.js +0 -9
  245. package/dist/commands/promote.js.map +0 -1
  246. package/dist/commands/secret/audit/list.d.ts +0 -14
  247. package/dist/commands/secret/audit/list.d.ts.map +0 -1
  248. package/dist/commands/secret/audit/list.js +0 -16
  249. package/dist/commands/secret/audit/list.js.map +0 -1
  250. package/dist/commands/secret/create.d.ts +0 -18
  251. package/dist/commands/secret/create.d.ts.map +0 -1
  252. package/dist/commands/secret/create.js +0 -33
  253. package/dist/commands/secret/create.js.map +0 -1
  254. package/dist/commands/secret/delete.d.ts +0 -15
  255. package/dist/commands/secret/delete.d.ts.map +0 -1
  256. package/dist/commands/secret/delete.js +0 -20
  257. package/dist/commands/secret/delete.js.map +0 -1
  258. package/dist/commands/secret/list.d.ts +0 -10
  259. package/dist/commands/secret/list.d.ts.map +0 -1
  260. package/dist/commands/secret/list.js +0 -14
  261. package/dist/commands/secret/list.js.map +0 -1
  262. package/dist/commands/secret/rotate.d.ts +0 -18
  263. package/dist/commands/secret/rotate.d.ts.map +0 -1
  264. package/dist/commands/secret/rotate.js +0 -30
  265. package/dist/commands/secret/rotate.js.map +0 -1
  266. package/dist/commands/secret/update.d.ts +0 -17
  267. package/dist/commands/secret/update.d.ts.map +0 -1
  268. package/dist/commands/secret/update.js +0 -37
  269. package/dist/commands/secret/update.js.map +0 -1
  270. package/dist/commands/skill/install.d.ts +0 -11
  271. package/dist/commands/skill/install.d.ts.map +0 -1
  272. package/dist/commands/skill/install.js +0 -52
  273. package/dist/commands/skill/install.js.map +0 -1
  274. package/dist/commands/skill/validate.d.ts +0 -9
  275. package/dist/commands/skill/validate.d.ts.map +0 -1
  276. package/dist/commands/skill/validate.js +0 -32
  277. package/dist/commands/skill/validate.js.map +0 -1
  278. package/dist/commands/test.d.ts +0 -9
  279. package/dist/commands/test.d.ts.map +0 -1
  280. package/dist/commands/test.js +0 -7
  281. package/dist/commands/test.js.map +0 -1
  282. package/dist/commands/workflow/provider/list.d.ts +0 -10
  283. package/dist/commands/workflow/provider/list.d.ts.map +0 -1
  284. package/dist/commands/workflow/provider/list.js +0 -14
  285. package/dist/commands/workflow/provider/list.js.map +0 -1
  286. package/dist/commands/workflow/provider/rotate.d.ts +0 -15
  287. package/dist/commands/workflow/provider/rotate.d.ts.map +0 -1
  288. package/dist/commands/workflow/provider/rotate.js +0 -24
  289. package/dist/commands/workflow/provider/rotate.js.map +0 -1
  290. package/dist/secret-value.d.ts +0 -5
  291. package/dist/secret-value.d.ts.map +0 -1
  292. package/dist/secret-value.js +0 -15
  293. package/dist/secret-value.js.map +0 -1
@@ -0,0 +1,9 @@
1
+ import { type StudioCliEvent, type StudioCliEventType } from "openxiangda-contracts";
2
+ export declare class StudioCliEventStream {
3
+ readonly runId: string;
4
+ private readonly write;
5
+ private sequence;
6
+ constructor(runId: string, write?: (event: StudioCliEvent) => void);
7
+ emit(type: StudioCliEventType, payload: Record<string, unknown>): StudioCliEvent;
8
+ }
9
+ //# sourceMappingURL=studio-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio-events.d.ts","sourceRoot":"","sources":["../src/studio-events.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACxB,MAAM,uBAAuB,CAAC;AAE/B,qBAAa,oBAAoB;IAI7B,QAAQ,CAAC,KAAK,EAAE,MAAM;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJxB,OAAO,CAAC,QAAQ,CAAK;gBAGV,KAAK,EAAE,MAAM,EACL,KAAK,GAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAElD;IAUH,IAAI,CAAC,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAahE"}
@@ -0,0 +1,30 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { STUDIO_CLI_EVENT_SCHEMA_VERSION, } from "openxiangda-contracts";
3
+ export class StudioCliEventStream {
4
+ runId;
5
+ write;
6
+ sequence = 0;
7
+ constructor(runId, write = event => {
8
+ process.stdout.write(`${JSON.stringify(event)}\n`);
9
+ }) {
10
+ this.runId = runId;
11
+ this.write = write;
12
+ if (!runId || runId.length > 256) {
13
+ throw Object.assign(new Error("STUDIO_RUN_ID_INVALID: runId 必须为 1 到 256 个字符"), { code: "STUDIO_RUN_ID_INVALID", retryable: false });
14
+ }
15
+ }
16
+ emit(type, payload) {
17
+ const event = {
18
+ schemaVersion: STUDIO_CLI_EVENT_SCHEMA_VERSION,
19
+ eventId: randomUUID(),
20
+ runId: this.runId,
21
+ seq: ++this.sequence,
22
+ type,
23
+ timestamp: new Date().toISOString(),
24
+ payload,
25
+ };
26
+ this.write(event);
27
+ return event;
28
+ }
29
+ }
30
+ //# sourceMappingURL=studio-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio-events.js","sourceRoot":"","sources":["../src/studio-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,+BAA+B,GAGhC,MAAM,uBAAuB,CAAC;AAE/B,MAAM,OAAO,oBAAoB;IAIpB;IACQ;IAJX,QAAQ,GAAG,CAAC,CAAC;IAErB,YACW,KAAa,EACL,QAAyC,KAAK,CAAC,EAAE;QAChE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC;QAHQ,UAAK,GAAL,KAAK,CAAQ;QACL,UAAK,GAAL,KAAK,CAErB;QAED,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YACjC,MAAM,MAAM,CAAC,MAAM,CACjB,IAAI,KAAK,CAAC,8CAA8C,CAAC,EACzD,EAAE,IAAI,EAAE,uBAAuB,EAAE,SAAS,EAAE,KAAK,EAAE,CACpD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAwB,EAAE,OAAgC;QAC7D,MAAM,KAAK,GAAmB;YAC5B,aAAa,EAAE,+BAA+B;YAC9C,OAAO,EAAE,UAAU,EAAE;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,EAAE,IAAI,CAAC,QAAQ;YACpB,IAAI;YACJ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,OAAO;SACR,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAClB,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import { type ToolchainCapsule } from "openxiangda-devkit-core";
2
+ export declare function resolveCliToolchainCapsule(templateRoot?: string): ToolchainCapsule;
3
+ export declare function resolveDefaultTemplate(): string;
4
+ //# sourceMappingURL=toolchain-capsule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolchain-capsule.d.ts","sourceRoot":"","sources":["../src/toolchain-capsule.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,gBAAgB,EACtB,MAAM,yBAAyB,CAAC;AAOjC,wBAAgB,0BAA0B,CACxC,YAAY,SAA2B,GACtC,gBAAgB,CAsBlB;AAED,wBAAgB,sBAAsB,WAIrC"}
@@ -0,0 +1,116 @@
1
+ import { createToolchainCapsule, isOpenXiangdaPackageName, TOOLCHAIN_CAPSULE_MAX_MANIFEST_BYTES, TOOLCHAIN_CAPSULE_MAX_PACKAGE_FILES, ToolchainCapsuleScanLimitError, } from "openxiangda-devkit-core";
2
+ import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
3
+ import { dirname, join, relative, resolve } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
6
+ export function resolveCliToolchainCapsule(templateRoot = resolveDefaultTemplate()) {
7
+ const localVersions = readLocalPackageVersions();
8
+ const versions = new Map();
9
+ for (const dependency of readTemplateDependencies(templateRoot)) {
10
+ const value = dependency.specifier.startsWith("workspace:")
11
+ ? localVersions.get(dependency.name)
12
+ : dependency.specifier;
13
+ if (!value || /[<>=*^~| ]/.test(value)) {
14
+ throw new Error(`OPENXIANGDA_TEMPLATE_CAPSULE_VERSION_UNRESOLVED: ${dependency.name}`);
15
+ }
16
+ const previous = versions.get(dependency.name);
17
+ if (previous && previous !== value) {
18
+ throw new Error(`OPENXIANGDA_TEMPLATE_CAPSULE_SPLIT: ${dependency.name}`);
19
+ }
20
+ versions.set(dependency.name, value);
21
+ }
22
+ return createToolchainCapsule(versions, "cli-template");
23
+ }
24
+ export function resolveDefaultTemplate() {
25
+ const repository = resolve(packageRoot, "../../templates/application");
26
+ if (existsSync(repository))
27
+ return repository;
28
+ return join(packageRoot, "template");
29
+ }
30
+ function readLocalPackageVersions() {
31
+ const packagesRoot = resolve(packageRoot, "..");
32
+ const versions = new Map();
33
+ const self = readManifest(join(packageRoot, "package.json"));
34
+ if (self &&
35
+ typeof self.name === "string" &&
36
+ typeof self.version === "string" &&
37
+ isOpenXiangdaPackageName(self.name)) {
38
+ versions.set(self.name, self.version);
39
+ }
40
+ for (const entry of readdirSync(packagesRoot, { withFileTypes: true }).sort((left, right) => left.name.localeCompare(right.name))) {
41
+ if (!entry.isDirectory())
42
+ continue;
43
+ const manifest = readManifest(join(packagesRoot, entry.name, "package.json"));
44
+ if (manifest &&
45
+ typeof manifest.name === "string" &&
46
+ typeof manifest.version === "string" &&
47
+ isOpenXiangdaPackageName(manifest.name)) {
48
+ versions.set(manifest.name, manifest.version);
49
+ }
50
+ }
51
+ return versions;
52
+ }
53
+ function readTemplateDependencies(root) {
54
+ const dependencies = [];
55
+ let packageFileCount = 0;
56
+ const visit = (directory) => {
57
+ for (const entry of readdirSync(directory, { withFileTypes: true }).sort((left, right) => left.name.localeCompare(right.name))) {
58
+ if (["node_modules", "dist", ".openxiangda"].includes(entry.name)) {
59
+ continue;
60
+ }
61
+ const path = join(directory, entry.name);
62
+ if (entry.isDirectory()) {
63
+ visit(path);
64
+ continue;
65
+ }
66
+ if (!entry.isFile() || entry.name !== "package.json")
67
+ continue;
68
+ packageFileCount += 1;
69
+ if (packageFileCount > TOOLCHAIN_CAPSULE_MAX_PACKAGE_FILES) {
70
+ throw new ToolchainCapsuleScanLimitError(`template package.json count exceeds ${TOOLCHAIN_CAPSULE_MAX_PACKAGE_FILES}`);
71
+ }
72
+ if (statSync(path).size > TOOLCHAIN_CAPSULE_MAX_MANIFEST_BYTES) {
73
+ throw new ToolchainCapsuleScanLimitError(`${relative(root, path)} exceeds ${TOOLCHAIN_CAPSULE_MAX_MANIFEST_BYTES} bytes`);
74
+ }
75
+ const manifest = readManifest(path);
76
+ if (!manifest)
77
+ continue;
78
+ for (const section of [
79
+ "dependencies",
80
+ "devDependencies",
81
+ "peerDependencies",
82
+ "optionalDependencies",
83
+ ]) {
84
+ const values = manifest[section];
85
+ if (!values || typeof values !== "object")
86
+ continue;
87
+ for (const [name, specifier] of Object.entries(values)) {
88
+ if (!isOpenXiangdaPackageName(name)) {
89
+ continue;
90
+ }
91
+ dependencies.push({
92
+ name,
93
+ specifier: String(specifier),
94
+ packageFile: relative(root, path).replaceAll("\\", "/"),
95
+ section,
96
+ });
97
+ }
98
+ }
99
+ }
100
+ };
101
+ visit(resolve(root));
102
+ return dependencies.sort((left, right) => left.name.localeCompare(right.name) ||
103
+ left.packageFile.localeCompare(right.packageFile) ||
104
+ left.section.localeCompare(right.section));
105
+ }
106
+ function readManifest(path) {
107
+ try {
108
+ return JSON.parse(readFileSync(path, "utf8"));
109
+ }
110
+ catch (error) {
111
+ if (error.code === "ENOENT")
112
+ return undefined;
113
+ throw error;
114
+ }
115
+ }
116
+ //# sourceMappingURL=toolchain-capsule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolchain-capsule.js","sourceRoot":"","sources":["../src/toolchain-capsule.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,24 +1,30 @@
1
1
  {
2
2
  "name": "openxiangda-cli",
3
- "version": "2.0.0-alpha.18",
4
- "description": "Thin application-level CLI for OpenXiangda 2.0.",
3
+ "version": "2.0.0-alpha.182",
4
+ "description": "OpenXiangda 2.0 应用生命周期命令、创建器与模板。",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
8
- "bin": {
9
- "openxiangda": "./bin/run.js"
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ },
13
+ "./run": "./bin/run.js",
14
+ "./package.json": "./package.json"
10
15
  },
11
16
  "files": [
12
17
  "bin/",
13
18
  "dist/",
19
+ "template/",
14
20
  "README.md"
15
21
  ],
16
22
  "dependencies": {
17
23
  "@oclif/core": "4.13.3",
18
- "openxiangda-contracts": "2.0.0-alpha.12",
19
- "openxiangda-skill-kit": "2.0.0-alpha.17",
20
- "create-openxiangda": "2.0.0-alpha.16",
21
- "openxiangda-devkit-core": "2.0.0-alpha.15"
24
+ "openxiangda-contracts": "2.0.0-alpha.91",
25
+ "openxiangda-devkit-core": "2.0.0-alpha.117",
26
+ "openxiangda-mcp": "2.0.0-alpha.117",
27
+ "openxiangda-skill-kit": "2.0.0-alpha.143"
22
28
  },
23
29
  "devDependencies": {
24
30
  "tsx": "4.23.12",
@@ -35,8 +41,9 @@
35
41
  },
36
42
  "license": "MIT",
37
43
  "scripts": {
38
- "build": "tsc -p tsconfig.json",
44
+ "build": "node ../../scripts/prune-package-dist.mjs && tsc -p tsconfig.json",
45
+ "build:release": "node ../../scripts/prune-package-dist.mjs && pnpm build",
39
46
  "check": "tsc -p tsconfig.json --noEmit",
40
- "test": "tsx --test test/*.test.ts"
47
+ "test": "node scripts/prepare-template.mjs && tsx --test test/*.test.ts && node ../../scripts/verify-cli-blackbox.mjs"
41
48
  }
42
49
  }
@@ -0,0 +1,23 @@
1
+ node_modules
2
+ **/node_modules
3
+ dist
4
+ **/dist
5
+ coverage
6
+ **/coverage
7
+ playwright-report
8
+ **/playwright-report
9
+ test-results
10
+ **/test-results
11
+ .openxiangda
12
+ **/.openxiangda
13
+ .turbo
14
+ **/.turbo
15
+ .turbopack
16
+ **/.turbopack
17
+ .umi
18
+ **/.umi
19
+ .umi-production
20
+ **/.umi-production
21
+ .git
22
+ *.log
23
+ **/*.log
@@ -0,0 +1,3 @@
1
+ # openxiangda dev injects these values. Do not put platform tokens in this file.
2
+ OPENXIANGDA_APP_CODE=instrument-center
3
+ OPENXIANGDA_DEV_HOST=127.0.0.1
@@ -0,0 +1,26 @@
1
+ # 应用开发约定
2
+
3
+ <!-- OPENXIANGDA:BEGIN -->
4
+ ## 平台约定
5
+
6
+ 本项目使用 OpenXiangda 2.0。进入项目后以本地精确依赖和锁文件为准,使用 `pnpm openxiangda`;先运行 `context --json` 确认版本和绑定,使用 `docs` 按任务读取当前中文资料。
7
+
8
+ - 模型、页面、导航和权限由应用声明一次;编译器生成契约。业务代码不改生成结果、不创建 platform/data、不复制平台 Router、字段组件、客户端或权限状态。
9
+ - 当前用户、角色并集、数据授权和部署状态归平台;应用不保存凭据或授权快照。普通 CRUD 走 Data API,真实业务动作才按需启用 Nest。
10
+ - 标准业务字段使用 `openxiangda/field-kit`;PC 补充控件使用 antd,移动使用有作用域的 `openxiangda/mobile` 和 MobileSurface,不引入上游全局重置。
11
+ - 无账号表单读取 `docs public-access`,使用 frontend.publicAccess 和专用客户端;标准审批、通知和后端均按需启用。
12
+ - 日常使用 dev 和聚焦测试。只验证时使用 check;授权部署时直接 deploy,它已包含检查、测试和构建。生产必须指定成功测试运行并复用同一版本。
13
+ - deploy 默认持续反馈并跟踪平台结果;观察中断用 status <运行ID> --watch 继续,保留原运行,不重新构建。平台部署成功后仍需真实角色业务验收。
14
+ - 开发开始先同步远端默认主分支;同一工作区只有一个写者。发布前将本轮源码、生成契约与记录合入并推送主分支,从干净且同步的主分支冻结候选;任务分支已推送不等于已合入主线。不要覆盖其他会话改动或自动合并所有分支。
15
+ - 默认读取 AppSpec 当前规格、活动变更和阶段缺口,按角色、规则、页面、数据澄清模糊需求,再评估架构、权限和性能边界。总纲保存长期规则,本轮变更关联需求、任务、源码与 AC 验收;测试发布前完成设计与计划,生产晋级前保存绑定原测试运行及包摘要的实际验收报告。更新当前规则、验证与发布结果和交接后归档;不得编造确认或通过结果。
16
+ - 根据变化风险记录业务意图。无行为变化引用已有记录;已有授权和已确认意图不重复向用户请求机械确认。真实角色和浏览器验收与本地测试分别记录。
17
+ - 失败保留错误码、指针和原候选;查询平台状态后使用允许的恢复操作,不自动重放未知结果。
18
+
19
+ MCP 使用同一项目 CLI:`pnpm exec openxiangda --mcp-stdio --cwd <workspace>`。先读取 workspace_context,再按任务读取 docs_read 和当前契约。登录、创建及长期 dev 使用 CLI/终端。
20
+
21
+ 详细用法:`pnpm openxiangda docs development`、`docs frontend`、`docs data-authz`、`docs administration`、`docs testing`、`docs delivery`。按需加载,无需每次通读全部资料。
22
+ <!-- OPENXIANGDA:END -->
23
+
24
+ ## 项目自有约定
25
+
26
+ 在此补充本项目的业务范围和团队要求;平台资料刷新保留本节内容。
@@ -0,0 +1,45 @@
1
+ # OpenXiangda 2.0 应用
2
+
3
+ 本项目使用精确版本的 openxiangda 根包。默认包含 Web 和共享契约,普通 CRUD、标准审批与通知由平台执行;真实业务动作才按需启用 Nest。
4
+
5
+ ## 开始
6
+
7
+ ```bash
8
+ pnpm install --frozen-lockfile
9
+ pnpm openxiangda context --json
10
+ pnpm openxiangda dev
11
+ ```
12
+
13
+ 依赖已安装时无需重复安装。开发连接已绑定的远端测试数据,终端和页面显示实际环境。缺少账号或绑定时按命令错误提示处理;不要调用旧版全局 CLI。
14
+
15
+ ## 阅读资料
16
+
17
+ ```bash
18
+ pnpm openxiangda docs
19
+ pnpm openxiangda docs development
20
+ pnpm openxiangda docs application-foundation
21
+ pnpm openxiangda docs frontend
22
+ pnpm openxiangda docs data-authz
23
+ ```
24
+
25
+ 资料来自当前根包;长主题支持 --section <章节ID>。AGENTS.md 的平台段说明基本约定,项目自有内容保留在该段之外。AI Skill 按任务读取同源资料。
26
+
27
+ ## 声明与页面
28
+
29
+ 业务模型和页面选择保存在 modules,应用根配置负责装配。模型不隐含导航或写授权。字段与标准 CRUD 使用平台组件;PC 控件使用 antd,移动使用 openxiangda/mobile。应用负责最小文档重置和局部样式,不直接导入 antd-mobile 全局重置。
30
+
31
+ apps/server 仅在启用后端时初始化。后续 check/dev 保留业务源码,普通 CRUD 不增加 controller。
32
+
33
+ ## 检查与发布
34
+
35
+ 只检查时运行 `pnpm openxiangda check`;需要发布测试环境时直接运行 `pnpm openxiangda deploy`,它已包含检查、测试和构建。纯前端无需 Docker,启用后端时才构建官方 Dockerfile 镜像。
36
+
37
+ 运行 status/logs 确认平台结果并完成真实角色验收。生产使用 `pnpm openxiangda deploy --environment production --from <成功测试运行ID>`;`--dry-run` 只预览。完整发布、取消、恢复和回滚说明使用 `pnpm openxiangda docs delivery`。
38
+
39
+ ## MCP
40
+
41
+ ```bash
42
+ pnpm exec openxiangda --mcp-stdio --cwd <项目绝对路径>
43
+ ```
44
+
45
+ 先读 workspace_context,再按需读取 docs_read 和 contract_describe;升级包后重启连接。登录、创建与长期开发进程继续使用 CLI。
@@ -0,0 +1,14 @@
1
+ node_modules/
2
+ dist/
3
+ coverage/
4
+ playwright-report/
5
+ test-results/
6
+ .openxiangda/
7
+ .turbo/
8
+ .turbopack/
9
+ .umi/
10
+ .umi-production/
11
+ .codegraph/
12
+ .env
13
+ *.log
14
+ .DS_Store
@@ -0,0 +1,15 @@
1
+ <!doctype html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <meta name="openxiangda-runtime-base" content="/" />
7
+ <meta name="openxiangda-app-code" content="native-projection-app" />
8
+ <meta name="openxiangda-environment" content="production" />
9
+ <title>OpenXiangda Standard Data API Live Acceptance</title>
10
+ </head>
11
+ <body>
12
+ <div id="root"></div>
13
+ <script type="module" src="/e2e/data-api-live-fixture.tsx"></script>
14
+ </body>
15
+ </html>
@@ -0,0 +1,5 @@
1
+ export {
2
+ requestApplicationApi,
3
+ searchDirectory,
4
+ searchResource,
5
+ } from 'openxiangda/core';
@@ -0,0 +1,15 @@
1
+ .component-defaults-page {
2
+ display: grid;
3
+ align-content: start;
4
+ gap: 16px;
5
+ padding: 24px;
6
+ }
7
+
8
+ .component-defaults-panel {
9
+ border: 1px solid var(--ant-color-border-secondary);
10
+ border-radius: var(--ant-border-radius);
11
+ background: var(--ant-color-bg-container);
12
+ padding: 24px;
13
+ color: var(--ant-color-text);
14
+ box-shadow: var(--ant-box-shadow-tertiary);
15
+ }
@@ -0,0 +1,162 @@
1
+ import { Refine } from '@refinedev/core';
2
+ import { App as AntdApp } from 'antd';
3
+ import React from 'react';
4
+ import ReactDOM from 'react-dom/client';
5
+ import { MemoryRouter, Route, Routes } from 'react-router-dom';
6
+ import {
7
+ OpenXiangdaUiProvider,
8
+ createApplicationProvider,
9
+ GeneratedResourcePage,
10
+ OpenXiangdaResourceDefinitionsProvider,
11
+ RuntimeBoundary,
12
+ type GeneratedResourceDefinition,
13
+ } from 'openxiangda/react';
14
+ import 'openxiangda/react/styles.css';
15
+
16
+ const code = 'field-records';
17
+ const capabilityBase = `app:native-projection-app:data:${code}`;
18
+ const capabilities = {
19
+ read: `${capabilityBase}:read`,
20
+ create: `${capabilityBase}:create`,
21
+ update: `${capabilityBase}:update`,
22
+ delete: `${capabilityBase}:delete`,
23
+ };
24
+
25
+ function fieldCapabilities() {
26
+ return {
27
+ readCapabilities: [capabilities.read],
28
+ createCapabilities: [capabilities.create],
29
+ updateCapabilities: [capabilities.update],
30
+ };
31
+ }
32
+
33
+ export const liveDefinition: GeneratedResourceDefinition = {
34
+ code,
35
+ name: '字段协议记录',
36
+ capabilities,
37
+ surface: {
38
+ mutationOwner: 'native',
39
+ generated: {
40
+ list: true,
41
+ detail: true,
42
+ create: true,
43
+ update: true,
44
+ delete: true,
45
+ },
46
+ fields: {
47
+ text_short: {
48
+ label: '标题',
49
+ type: 'text.short',
50
+ widget: 'text',
51
+ requiredHint: true,
52
+ maxLength: 120,
53
+ list: true,
54
+ searchable: true,
55
+ sortable: true,
56
+ ...fieldCapabilities(),
57
+ },
58
+ option_single: {
59
+ label: '单选快照',
60
+ type: 'option.single',
61
+ widget: 'radio',
62
+ options: [
63
+ { label: 'Open', value: 'open' },
64
+ { label: 'Closed', value: 'closed' },
65
+ ],
66
+ list: true,
67
+ ...fieldCapabilities(),
68
+ },
69
+ option_multiple: {
70
+ label: '多选快照',
71
+ type: 'option.multiple',
72
+ widget: 'checkbox',
73
+ options: [
74
+ { label: 'Open', value: 'open' },
75
+ { label: 'Urgent', value: 'urgent' },
76
+ ],
77
+ list: true,
78
+ ...fieldCapabilities(),
79
+ },
80
+ location_value: {
81
+ label: '精确定位',
82
+ type: 'location',
83
+ widget: 'location',
84
+ list: true,
85
+ ...fieldCapabilities(),
86
+ },
87
+ },
88
+ list: {
89
+ defaultPageSize: 20,
90
+ searchableFields: ['text_short'],
91
+ filterFields: ['option_single'],
92
+ defaultSort: { field: 'text_short', order: 'asc' },
93
+ },
94
+ form: { layout: 'sections' },
95
+ detail: { layout: 'sections' },
96
+ mobile: { enabled: true },
97
+ },
98
+ };
99
+
100
+ const definitions = { [code]: liveDefinition };
101
+ const provider = createApplicationProvider(definitions);
102
+ const routeBase = `/admin/resources/${code}`;
103
+ const routePaths = {
104
+ fallback: '/admin',
105
+ list: routeBase,
106
+ create: `${routeBase}/new`,
107
+ detail: `${routeBase}/:id`,
108
+ edit: `${routeBase}/:id/edit`,
109
+ };
110
+ const initialPath =
111
+ new URLSearchParams(window.location.search).get('initial') || routeBase;
112
+
113
+ function resourcePage(mode: 'list' | 'create' | 'edit' | 'detail') {
114
+ return (
115
+ <GeneratedResourcePage
116
+ definition={liveDefinition}
117
+ mode={mode}
118
+ paths={routePaths}
119
+ resourceCode={code}
120
+ />
121
+ );
122
+ }
123
+
124
+ ReactDOM.createRoot(document.getElementById('root')!).render(
125
+ <React.StrictMode>
126
+ <OpenXiangdaResourceDefinitionsProvider definitions={definitions}>
127
+ <OpenXiangdaUiProvider>
128
+ <AntdApp>
129
+ <RuntimeBoundary>
130
+ <MemoryRouter initialEntries={[initialPath]}>
131
+ <Refine
132
+ dataProvider={provider}
133
+ resources={[
134
+ {
135
+ name: code,
136
+ list: routePaths.list,
137
+ create: routePaths.create,
138
+ edit: routePaths.edit,
139
+ show: routePaths.detail,
140
+ },
141
+ ]}
142
+ >
143
+ <Routes>
144
+ <Route path={routePaths.list} element={resourcePage('list')} />
145
+ <Route path={routePaths.create} element={resourcePage('create')} />
146
+ <Route
147
+ path={routePaths.detail}
148
+ element={resourcePage('detail')}
149
+ />
150
+ <Route
151
+ path={routePaths.edit}
152
+ element={resourcePage('edit')}
153
+ />
154
+ </Routes>
155
+ </Refine>
156
+ </MemoryRouter>
157
+ </RuntimeBoundary>
158
+ </AntdApp>
159
+ </OpenXiangdaUiProvider>
160
+ </OpenXiangdaResourceDefinitionsProvider>
161
+ </React.StrictMode>
162
+ );