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.
- package/README.md +13 -0
- package/bin/run.js +92 -0
- package/dist/base.d.ts +44 -0
- package/dist/base.d.ts.map +1 -0
- package/dist/base.js +119 -0
- package/dist/base.js.map +1 -0
- package/dist/commands/accept.d.ts +23 -0
- package/dist/commands/accept.d.ts.map +1 -0
- package/dist/commands/accept.js +21 -0
- package/dist/commands/accept.js.map +1 -0
- package/dist/commands/check.d.ts +22 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +7 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/create.d.ts +23 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +101 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/deploy.d.ts +26 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +42 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/dev.d.ts +24 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +28 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/login.d.ts +24 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +73 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logs.d.ts +25 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +9 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/rollback.d.ts +24 -0
- package/dist/commands/rollback.d.ts.map +1 -0
- package/dist/commands/rollback.js +16 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/skill.d.ts +26 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +43 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/status.d.ts +25 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +9 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/create-workspace.d.ts +31 -0
- package/dist/create-workspace.d.ts.map +1 -0
- package/dist/create-workspace.js +273 -0
- package/dist/create-workspace.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/toolchain-capsule.d.ts +4 -0
- package/dist/toolchain-capsule.d.ts.map +1 -0
- package/dist/toolchain-capsule.js +116 -0
- package/dist/toolchain-capsule.js.map +1 -0
- package/package.json +49 -0
- package/template/.dockerignore +23 -0
- package/template/.env.example +3 -0
- package/template/AGENTS.md +22 -0
- package/template/README.md +26 -0
- package/template/_gitignore +14 -0
- package/template/apps/server/Dockerfile +20 -0
- package/template/apps/server/package.json +27 -0
- package/template/apps/server/src/app.module.ts +43 -0
- package/template/apps/server/src/main.ts +5 -0
- package/template/apps/server/test/smoke.test.ts +16 -0
- package/template/apps/server/tsconfig.json +9 -0
- package/template/apps/web/data-api-live.e2e.html +15 -0
- package/template/apps/web/e2e/client-fixture.ts +5 -0
- package/template/apps/web/e2e/data-api-live-fixture.tsx +146 -0
- package/template/apps/web/e2e/data-api-live.spec.ts +138 -0
- package/template/apps/web/e2e/field-protocol-fixture.tsx +347 -0
- package/template/apps/web/e2e/field-protocol.spec.ts +186 -0
- package/template/apps/web/e2e/resources.spec.ts +285 -0
- package/template/apps/web/e2e/workflow.spec.ts +329 -0
- package/template/apps/web/field-protocol.e2e.html +15 -0
- package/template/apps/web/index.html +12 -0
- package/template/apps/web/package.json +32 -0
- package/template/apps/web/playwright.config.ts +44 -0
- package/template/apps/web/scripts/check.mjs +43 -0
- package/template/apps/web/scripts/verify-build.mjs +6 -0
- package/template/apps/web/src/main.tsx +21 -0
- package/template/apps/web/test/contracts.test.ts +99 -0
- package/template/apps/web/test/loopback.test.ts +62 -0
- package/template/apps/web/tsconfig.json +12 -0
- package/template/apps/web/vite.config.ts +31 -0
- package/template/openxiangda.config.ts +30 -0
- package/template/package.json +28 -0
- package/template/packages/contracts/package.json +23 -0
- package/template/packages/contracts/src/generated.ts +124 -0
- package/template/packages/contracts/src/index.ts +1 -0
- package/template/packages/contracts/tsconfig.json +9 -0
- package/template/pnpm-workspace.yaml +7 -0
- package/template/scripts/verify-template-budget.mjs +49 -0
- package/template/tsconfig.base.json +13 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-workspace.js","sourceRoot":"","sources":["../src/create-workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EACL,MAAM,EACN,UAAU,EACV,SAAS,EACT,YAAY,EACZ,WAAW,EACX,UAAU,EACV,QAAQ,EACR,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EACL,qCAAqC,EACrC,wBAAwB,EACxB,8BAA8B,EAC9B,0BAA0B,GAC3B,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAmBhC,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAA2B;IAC/D,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,YAAY;QACjC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC;QAC7B,CAAC,CAAC,sBAAsB,EAAE,CAAC;IAC7B,IAAI,CAAC,iCAAiC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAC7D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,EAAE,CAAC,CAAC;IAC9E,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE;QACvB,SAAS,EAAE,IAAI;QACf,YAAY,EAAE,KAAK;QACnB,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC;KACxD,CAAC,CAAC;IACH,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACnD,IAAI,UAAU,CAAC,eAAe,CAAC;QAC7B,UAAU,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IAC1D,WAAW,CAAC,MAAM,EAAE;QAClB,CAAC,mBAAmB,EAAE,KAAK,CAAC,OAAO,CAAC;QACpC,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC;QACtB,CAAC,yBAAyB,EAAE,KAAK,CAAC,OAAO,CAAC;QAC1C,CAAC,gBAAgB,EAAE,KAAK,CAAC,IAAI,CAAC;KAC/B,CAAC,CAAC;IACH,MAAM,gBAAgB,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IAC9D,8BAA8B,CAC5B,MAAM,EACN,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CACnD,CAAC;IACF,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY;QACrC,CAAC,CAAC,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC;QAC/C,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC;IACxC,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,gBAAgB,CACpB,MAAM,EACN;YACE,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,gBAAgB;SACjB,CACF,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,SAAS,EAAE,OAAO;QAClB,SAAS,EAAE,OAAO;QAClB,kBAAkB,EAAE,CAAC,OAAO;QAC5B,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,SAAiB,EACjB,UAAmC,EAAE;IAErC,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,gBAAgB,GACpB,OAAO,CAAC,gBAAgB,IAAI,0BAA0B,EAAE,CAAC;IAC3D,MAAM,iBAAiB,GAAG,0BAA0B,CAClD,qCAAqC,CAAC,IAAI,CAAC,EAC3C,gBAAgB,CACjB,CAAC;IACF,IAAI,iBAAiB;QAAE,MAAM,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,SAAS,CACtB,MAAM,EACN,CAAC,SAAS,CAAC,EACX,OAAO,CAAC,aAAa,KAAK,SAAS;QACjC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE;QACpE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CACpC,CAAC;IACF,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,qBAAqB,EAAE,CAAC;IACvE,MAAM,SAAS,GAAG,MAAM,IAAI,8BAA8B,CAAC;QACzD,gBAAgB;KACjB,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IACtB,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,8BAA8B,SAAS,CAAC,WAAW;aAChD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;aAC3B,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC,IAAI,CAAC;AACxB,CAAC;AAED,SAAS,qBAAqB,CAAC,UAAsB;IACnD,OAAO,MAAM,CAAC,MAAM,CAClB,IAAI,KAAK,CAAC,GAAG,UAAU,CAAC,IAAI,KAAK,UAAU,CAAC,OAAO,EAAE,CAAC,EACtD;QACE,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,IAAI,EAAE,UAAU;QAChB,SAAS,EAAE,KAAK;KACjB,CACF,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB;IAC5B,OAAO,MAAM,CAAC,MAAM,CAClB,IAAI,KAAK,CACP,kDAAkD,CACnD,EACD,EAAE,IAAI,EAAE,0BAA0B,EAAE,SAAS,EAAE,IAAI,EAAE,CACtD,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,YAAoB,EAAE,MAAc;IAC/D,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAClE,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,CAAC,wIAAwI,CAAC,IAAI,CACnJ,IAAI,CACL,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,aAAqB,EAAE,SAAiB;IACjE,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,MAAM,SAAS,GAA2B,EAAE,CAAC;IAC7C,MAAM,aAAa,GAAG,IAAI,GAAG,EAG1B,CAAC;IACJ,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,YAAY,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACvE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAAE,SAAS;QACnC,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;YAAE,SAAS;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CACzB,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CACX,CAAC;QAC7B,MAAM,IAAI,GAAG,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,IAAI,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,wBAAwB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IACxE,MAAM,aAAa,GAAG,IAAI,CACxB,aAAa,EACb,cAAc,EACd,qBAAqB,CACtB,CAAC;IACF,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACxC,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC,YAAY;YAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,EAAE,CAAC,CAAC;QAC3E,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;QACtC,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE;YAChD,GAAG,EAAE,WAAW;YAChB,QAAQ,EAAE,MAAM;SACjB,CAAC,CAAC;QACH,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CACb,2BAA2B,IAAI,KAAK,MAAM,CACxC,KAAK,CAAC,MAAM,IAAI,EAAE,CACnB,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CACjC,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,SAAS,CACtB,MAAM,EACN,CAAC,MAAM,EAAE,oBAAoB,EAAE,aAAa,CAAC,EAC7C,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,CACvC,CAAC;QACF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,0BAA0B,IAAI,KAAK,MAAM,CACvC,MAAM,CAAC,MAAM,IAAI,EAAE,CACpB,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAClC,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;aACxC,IAAI,EAAE;aACN,KAAK,CAAC,OAAO,CAAC;aACd,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACV,IAAI,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,GAAG,QAAQ,OAAO,EAAE,CAAC;IACtC,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,iCAAiC,YAAY,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CACX,CAAC;IAC7B,MAAM,YAAY,GAChB,WAAW,CAAC,IAAI,IAAI,OAAO,WAAW,CAAC,IAAI,KAAK,QAAQ;QACtD,CAAC,CAAE,WAAW,CAAC,IAAgC;QAC/C,CAAC,CAAC,EAAE,CAAC;IACT,WAAW,CAAC,IAAI,GAAG;QACjB,GAAG,YAAY;QACf,SAAS,EAAE;YACT,GAAG,CAAC,YAAY,CAAC,SAAS,IAAI,OAAO,YAAY,CAAC,SAAS,KAAK,QAAQ;gBACtE,CAAC,CAAE,YAAY,CAAC,SAAoC;gBACpD,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,SAAS;SACb;KACF,CAAC;IACF,aAAa,CACX,eAAe,EACf,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAC3C,MAAM,CACP,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,wBAAwB,CAC/B,aAAqB,EACrB,aAGC;IAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,eAAe,GAAG,CACtB,QAAiC,EACjC,QAAkB,EAClB,EAAE;QACF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YACvC,IAAI,CAAC,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ;gBAAE,SAAS;YAChE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC7C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE,SAAS;gBAC7D,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACnB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,CAAC,SAAiB,EAAE,EAAE;QAClC,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACpE,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;gBACvE,SAAS;YACX,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,KAAK,CAAC,WAAW,EAAE;gBAAE,KAAK,CAAC,IAAI,CAAC,CAAC;iBAChC,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBACzD,eAAe,CACb,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAA4B,EACjE,CAAC,cAAc,EAAE,iBAAiB,EAAE,sBAAsB,CAAC,CAC5D,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,KAAK,CAAC,aAAa,CAAC,CAAC;IACrB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAE,CAAC,CAAC;QACtD,IAAI,YAAY,EAAE,CAAC;YACjB,eAAe,CAAC,YAAY,CAAC,QAAQ,EAAE;gBACrC,cAAc;gBACd,sBAAsB;aACvB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,8BAA8B,CACrC,IAAY,EACZ,kBAA+C;IAE/C,MAAM,KAAK,GAAG,CAAC,SAAiB,EAAE,EAAE;QAClC,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACpE,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YACpE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,CAAC;gBACZ,SAAS;YACX,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;gBAAE,SAAS;YAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAGxD,CAAC;YACF,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,KAAK,MAAM,OAAO,IAAI;gBACpB,cAAc;gBACd,iBAAiB;gBACjB,kBAAkB;gBAClB,sBAAsB;aACvB,EAAE,CAAC;gBACF,MAAM,YAAY,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC1C,IAAI,CAAC,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ;oBAAE,SAAS;gBAChE,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC3D,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,OAAO,OAAO,KAAK,QAAQ;wBAChE,SAAS;oBACX,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC;wBAAE,SAAS;oBAChD,MAAM,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;oBAC3D,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBACtD,IAAI,CAAC,gBAAgB,IAAI,eAAe,KAAK,GAAG,EAAE,CAAC;wBACjD,MAAM,IAAI,KAAK,CAAC,2CAA2C,IAAI,EAAE,CAAC,CAAC;oBACrE,CAAC;oBACA,YAAuC,CAAC,IAAI,CAAC;wBAC5C,gBAAgB,IAAI,eAAe,CAAC;oBACtC,OAAO,GAAG,IAAI,CAAC;gBACjB,CAAC;YACH,CAAC;YACD,IAAI,OAAO;gBACT,aAAa,CACX,IAAI,EACJ,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAC3C,MAAM,CACP,CAAC;QACN,CAAC;IACH,CAAC,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAClB,IAAY,EACZ,YAA0D;IAE1D,MAAM,KAAK,GAAG,CAAC,SAAiB,EAAE,EAAE;QAClC,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACpE,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YACpE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,KAAK,CAAC,WAAW,EAAE;gBAAE,KAAK,CAAC,IAAI,CAAC,CAAC;iBAChC,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxC,IAAI,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACzC,KAAK,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,YAAY,EAAE,CAAC;oBACjD,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;gBACpD,CAAC;gBACD,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAED,SAAS,MAAM,CAAC,IAAY;IAC1B,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,SAAS;QAAE,OAAO,KAAK,CAAC;IAClD,OAAO,CACL,iDAAiD,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5D,kDAAkD,CAAC,IAAI,CAAC,IAAI,CAAC,CAC9D,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,cAAc,WAAW,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,cAAc,WAAW,CAAC"}
|
|
@@ -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
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "openxiangda-cli",
|
|
3
|
+
"version": "2.0.0-alpha.100",
|
|
4
|
+
"description": "Thin application-level CLI for OpenXiangda 2.0.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
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"
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"bin/",
|
|
18
|
+
"dist/",
|
|
19
|
+
"template/",
|
|
20
|
+
"README.md"
|
|
21
|
+
],
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@oclif/core": "4.13.3",
|
|
24
|
+
"openxiangda-contracts": "2.0.0-alpha.48",
|
|
25
|
+
"openxiangda-devkit-core": "2.0.0-alpha.63",
|
|
26
|
+
"openxiangda-mcp": "2.0.0-alpha.63",
|
|
27
|
+
"openxiangda-skill-kit": "2.0.0-alpha.81"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"tsx": "4.23.12",
|
|
31
|
+
"typescript": "5.9.3"
|
|
32
|
+
},
|
|
33
|
+
"engines": {
|
|
34
|
+
"node": ">=20"
|
|
35
|
+
},
|
|
36
|
+
"oclif": {
|
|
37
|
+
"bin": "openxiangda",
|
|
38
|
+
"dirname": "openxiangda",
|
|
39
|
+
"commands": "./dist/commands",
|
|
40
|
+
"topicSeparator": " "
|
|
41
|
+
},
|
|
42
|
+
"license": "MIT",
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "node ../../scripts/prune-package-dist.mjs && tsc -p tsconfig.json",
|
|
45
|
+
"build:release": "node ../../scripts/prune-package-dist.mjs && pnpm build",
|
|
46
|
+
"check": "tsc -p tsconfig.json --noEmit",
|
|
47
|
+
"test": "node scripts/prepare-template.mjs && tsx --test test/*.test.ts && node ../../scripts/verify-cli-blackbox.mjs"
|
|
48
|
+
}
|
|
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,22 @@
|
|
|
1
|
+
# OpenXiangda 2.0 Application Agent Contract
|
|
2
|
+
|
|
3
|
+
- Use only the workspace-pinned CLI: `pnpm openxiangda <command>`. Never invoke a bare global `openxiangda` inside a 2.0 task.
|
|
4
|
+
- Use Vite, React Router, Refine Core and Ant Design. Do not add Umi, ProComponents or another admin shell.
|
|
5
|
+
- Declare each resource once in `openxiangda.config.ts` with only `code`, `name`, `fields` and optional list/layout/data-policy settings. Each field owns type, label, required state, Surface flags, reference/file metadata and access. Resource codes are lower kebab-case.
|
|
6
|
+
- Never write resource-level `schemaVersion`, `appCode`, `schema`, `surface`, `capabilities`, `fieldPolicies` or `platform/data` modules. The compiler derives the strict DataResource, CRUD capabilities, Surface and AI Schema. The application manifest still starts with its one top-level `schemaVersion: 3`.
|
|
7
|
+
- Ordinary list/get/create/update/delete, filters, export and batch operations use the platform Native Data API. Do not create Function CRUD or NestJS wrappers.
|
|
8
|
+
- Add NestJS only for a named business action that needs a cross-resource transaction, an invariant or an external side effect.
|
|
9
|
+
- Every interactive business action binds `@OpenXiangdaOperation(operation)` and injects `OpenXiangdaBusinessDataApiService` or `OpenXiangdaStandardOperations`. The platform checks the action capability once at App API ingress; the trusted backend then has full Data access only to its exact application/environment while audit retains the initiating user. Do not author `authorizationJSON` or reapply the user's resource, row and field permissions inside the action.
|
|
10
|
+
- A NestJS backend declares only `enabled`, `isolation: 'shared' | 'dedicated'` and `resourceProfile: 'light' | 'standard'`. Never put raw Kubernetes resources, replicas, ports or environment maps in application metadata; the platform owns capacity and scaling.
|
|
11
|
+
- Use the current logged-in user and the union of that user's application roles. The generated client uses same-origin cookies and does not transmit a RoleSession header. Business code must not persist a platform Token or authorization result and must not implement a second identity path.
|
|
12
|
+
- Fields inherit the resource read/create/update capabilities. Use field `access` only to tighten them; arrays are all-of and `false` is explicit deny. There is no `write` fallback.
|
|
13
|
+
- Field `type` is semantic, never a hand-authored database type. The supported catalog is exactly `text.short`, `text.long`, `text.rich`, `number.integer`, `number.decimal`, `boolean`, `date`, `time`, `datetime`, `date-range`, `datetime-range`, `option.single`, `option.multiple`, `cascade.single`, `cascade.multiple`, `user.single`, `user.multiple`, `department.single`, `department.multiple`, `resource-ref.single`, `resource-ref.multiple`, `file`, `image`, `signature`, `address`, `location`, `json`, `serial-number`, `uuid` and `subtable`. The compiler alone derives PostgreSQL columns, constraints and indexes.
|
|
14
|
+
- Declare every custom operation capability in `authz.capabilities` with `kind: 'backend'`, then reference that same code from the operation and its allowed roles. Generated resource CRUD capabilities do not go in this catalog.
|
|
15
|
+
- Visitor duplicate protection uses `createVisitorReservation({ duplicateMatch: { fieldCode: submittedValue }, ... })`. `duplicateMatch` is a non-empty value map, never a field-name array, and no mutable pre-read is allowed.
|
|
16
|
+
- Desktop and mobile pages share values, validation and authorization, but use separate renderers. Options, members and departments store display snapshots; resource references store direct JSON display values; attachments, images and signatures use platform-managed file references.
|
|
17
|
+
- `option.*`, `user.*`, `department.*` and `resource-ref.*` values never collapse to scalar IDs. Single values store one labeled object and multiple values store object arrays. `resource-ref.*` JSON is not a foreign key, trusted target snapshot or automatically refreshed copy; current target state is read by `resourceCode` plus `value`. A resource source `labelField` must be `text.short` or `text.long`; `serial-number` is allowed in source search, description and snapshot fields, but not as the label. `location` accepts only exact WGS84 coordinates captured by DingTalk or browser geolocation; it has no manual input or `manual` source. Roles that consume directory-backed fields explicitly include `app:<app-code>:directory:read`.
|
|
18
|
+
- Derive role grants with `resourceCapabilityCodes(appCode, resourceCode)`. Declare current-user rows only with `currentUserDataPolicy(...)`; do not invent operators, values or alternate current-user spellings.
|
|
19
|
+
- Do not add compatibility aliases, migration branches or silent fallbacks for an earlier 2.0 alpha contract. Replace an incorrect contract and regenerate the application.
|
|
20
|
+
- Standard Workflow and Notification Hub are optional 2.0 modules. Enable them only through the canonical `openxiangda.config.ts` declarations and generated clients; never copy 1.x workflow/message code, tables, APIs, templates or callbacks into this workspace. Keep ordinary CRUD and application-specific state machines independent of them.
|
|
21
|
+
- Run `pnpm openxiangda check --json` after contract changes and read `data.sealedArtifact`; check never seals, and an older `.openxiangda/build/app-package.json` is not the current check result. Use `pnpm openxiangda accept --plan <file>` only for optional real preproduction identity acceptance; it never blocks delivery. Deploy with `pnpm openxiangda deploy`, inspect with `pnpm openxiangda status` and `pnpm openxiangda logs`, and use the platform rollback command rather than mutating K3s directly.
|
|
22
|
+
- AI-native clients start the workspace protocol through the same pinned binary: `pnpm exec openxiangda --mcp-stdio --cwd <workspace>`. Read `openxiangda://workspace/contracts` or call `contract_describe`, and require its `aiCatalog` and `aiCatalogDigest` to match the normal compiler output. This is a stdio transport mode, not a ninth CLI command. Never write an application MCP server, Catalog file, preview store or second authorization path.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# OpenXiangda 2.0 应用模板
|
|
2
|
+
|
|
3
|
+
这是干净的资源 CRUD 模板:Vite + React Router + Refine Core + Ant Design 前端、NestJS 平台启动层,以及平台 Data/AuthZ 声明。
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
pnpm openxiangda dev
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
当前应用只直接依赖一个精确版本的 `openxiangda` 根包,并在 lockfile 中锁定其内部实现包。创建另一个应用时使用当前安装的 OpenXiangda 2.0 Skill 给出的精确根包版本,不使用 `latest`、`alpha` 或全局命令。
|
|
10
|
+
|
|
11
|
+
在 `openxiangda.config.ts` 的 `data.resources` 中只声明资源 `code`、`name`、`fields` 和可选列表/布局/数据策略。每个字段一次写完语义 `type`、`label`、`required`、列表/筛选标记、`options`/`source`/`file` 与 `access`;不要再写 `schema`、`surface`、PostgreSQL 类型、资源 capabilities、资源 fieldPolicies 或 `platform/data` 模块。编译器据此生成标准后台列表、筛选、表单、详情、审计、文件上传、独立移动端页面、Data API 查询计划和 AI Schema。
|
|
12
|
+
|
|
13
|
+
成员、部门分别声明 `user.single`/`user.multiple` 和 `department.single`/`department.multiple`;同应用动态资源声明 `resource-ref.single`/`resource-ref.multiple` 及编译期固定的 `source`。这些字段都保存完整 `{label,value,...}` 显示快照,资源引用还保存 `resourceCode` 和声明的 `snapshot` 字段;查询和权限以稳定 `value` 为比较键。资源来源的 `labelField` 只能引用 `text.short` 或 `text.long`;流水号可用于搜索、描述和快照,不能作为显示标签。需要目录选择器的业务角色必须显式拥有 `app:<app-code>:directory:read` 能力。用 `resourceCapabilityCodes` 生成资源 CRUD 权限,用 `currentUserDataPolicy` 声明唯一的当前用户行规则。
|
|
14
|
+
|
|
15
|
+
字段组件、CRUD Renderer、Shell、Runtime 与 Data/Directory/File/App Client 都由 `openxiangda/react`、`openxiangda/field-kit` 和 `openxiangda/core` 统一提供,应用模板不复制这些实现。Nest 只在需要复杂事务或外部集成时增加 App API。标准客户端显式携带当前环境、使用同源 Cookie;业务代码不读取或持久化 Token、平台内部身份标识与授权结果。
|
|
16
|
+
|
|
17
|
+
前端一次读取当前登录用户在当前环境的完整应用角色并集和 capability 做展示保护,不提供角色选择器,也不发送 RoleSession header。服务端始终以同一角色并集权威执行操作、字段、行权限和 RLS。字段默认继承资源 read/create/update;`access` 数组为 all-of,`false` 为明确拒绝,无权字段在提交前从 payload 删除。
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
pnpm openxiangda check
|
|
21
|
+
pnpm openxiangda deploy
|
|
22
|
+
pnpm openxiangda status
|
|
23
|
+
pnpm openxiangda logs
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
`deploy` 使用本模板的 `apps/server/Dockerfile` 自动构建并推送 `linux/amd64` 镜像,再把不可变 digest 写入 AppPackage。纯 CRUD 应用可以保持 backend disabled;复杂事务再启用 Nest。
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
FROM node:22-alpine AS build
|
|
2
|
+
WORKDIR /workspace
|
|
3
|
+
RUN corepack enable
|
|
4
|
+
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml tsconfig.base.json ./
|
|
5
|
+
COPY apps/server/package.json apps/server/package.json
|
|
6
|
+
COPY packages/contracts/package.json packages/contracts/package.json
|
|
7
|
+
RUN node -e "const fs=require('node:fs'); const p=JSON.parse(fs.readFileSync('package.json','utf8')); delete p.devDependencies; fs.writeFileSync('package.json', JSON.stringify(p));"
|
|
8
|
+
RUN pnpm --filter @app/server --filter @app/contracts install --no-frozen-lockfile --ignore-scripts
|
|
9
|
+
COPY apps/server apps/server
|
|
10
|
+
COPY packages/contracts packages/contracts
|
|
11
|
+
RUN pnpm --filter @app/server... build
|
|
12
|
+
RUN pnpm --filter @app/server deploy --prod --legacy --ignore-scripts /output
|
|
13
|
+
|
|
14
|
+
FROM node:22-alpine AS runtime
|
|
15
|
+
ENV NODE_ENV=production
|
|
16
|
+
WORKDIR /app
|
|
17
|
+
COPY --from=build --chown=1000:1000 /output /app
|
|
18
|
+
USER 1000:1000
|
|
19
|
+
EXPOSE 3000
|
|
20
|
+
CMD ["node", "dist/main.js"]
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@app/server",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"dev": "tsx watch src/main.ts",
|
|
8
|
+
"check": "tsc -p tsconfig.json --noEmit",
|
|
9
|
+
"test": "tsx --test test/*.test.ts",
|
|
10
|
+
"build": "tsc -p tsconfig.json",
|
|
11
|
+
"start": "node dist/main.js"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@app/contracts": "workspace:*",
|
|
15
|
+
"@nestjs/common": "11.1.29",
|
|
16
|
+
"@nestjs/core": "11.1.29",
|
|
17
|
+
"@nestjs/platform-fastify": "11.1.29",
|
|
18
|
+
"openxiangda": "2.0.0-alpha.12",
|
|
19
|
+
"reflect-metadata": "0.2.2",
|
|
20
|
+
"rxjs": "7.8.2"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@types/node": "24.13.3",
|
|
24
|
+
"tsx": "4.23.12",
|
|
25
|
+
"typescript": "5.9.3"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Module } from '@nestjs/common';
|
|
2
|
+
import {
|
|
3
|
+
eventHandlerManifest,
|
|
4
|
+
eventSchemas,
|
|
5
|
+
eventSubscriptionCodes,
|
|
6
|
+
} from '@app/contracts';
|
|
7
|
+
import {
|
|
8
|
+
OpenXiangdaModule,
|
|
9
|
+
eventSigningSecretsFromEnvironment,
|
|
10
|
+
} from 'openxiangda/nest';
|
|
11
|
+
|
|
12
|
+
@Module({
|
|
13
|
+
imports: [
|
|
14
|
+
OpenXiangdaModule.forRoot({
|
|
15
|
+
appCode: process.env.OPENXIANGDA_APP_CODE || 'openxiangda-application',
|
|
16
|
+
platformBaseUrl:
|
|
17
|
+
process.env.OPENXIANGDA_PLATFORM_BASE_URL ||
|
|
18
|
+
'http://127.0.0.1:7001/service',
|
|
19
|
+
environmentKey:
|
|
20
|
+
process.env.OPENXIANGDA_ENVIRONMENT_KEY || 'preproduction',
|
|
21
|
+
environmentId:
|
|
22
|
+
process.env.OPENXIANGDA_ENVIRONMENT_ID || 'connected-development',
|
|
23
|
+
appVersionId:
|
|
24
|
+
process.env.OPENXIANGDA_APP_VERSION_ID || 'connected-development',
|
|
25
|
+
deploymentRunId:
|
|
26
|
+
process.env.OPENXIANGDA_DEPLOYMENT_RUN_ID || 'connected-development',
|
|
27
|
+
environmentHeadRevision: Number(
|
|
28
|
+
process.env.OPENXIANGDA_ENVIRONMENT_HEAD_REVISION || 1
|
|
29
|
+
),
|
|
30
|
+
backendRevisionId:
|
|
31
|
+
process.env.OPENXIANGDA_BACKEND_REVISION_ID || 'connected-development',
|
|
32
|
+
version: process.env.OPENXIANGDA_APP_VERSION || '0.1.0-dev',
|
|
33
|
+
connectedDevelopment:
|
|
34
|
+
process.env.OPENXIANGDA_CONNECTED_DEV === 'true',
|
|
35
|
+
eventHandlerManifest,
|
|
36
|
+
eventSchemas,
|
|
37
|
+
eventSigningSecrets: eventSigningSecretsFromEnvironment(
|
|
38
|
+
eventSubscriptionCodes
|
|
39
|
+
),
|
|
40
|
+
}),
|
|
41
|
+
],
|
|
42
|
+
})
|
|
43
|
+
export class AppModule {}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
import test from 'node:test';
|
|
4
|
+
|
|
5
|
+
test('the clean server template only owns platform bootstrap', () => {
|
|
6
|
+
const source = readFileSync(new URL('../src/app.module.ts', import.meta.url), 'utf8');
|
|
7
|
+
const main = readFileSync(new URL('../src/main.ts', import.meta.url), 'utf8');
|
|
8
|
+
assert.match(source, /OpenXiangdaModule\.forRoot/);
|
|
9
|
+
assert.match(source, /eventHandlerManifest/);
|
|
10
|
+
assert.match(source, /eventSigningSecretsFromEnvironment/);
|
|
11
|
+
assert.match(main, /bootstrapOpenXiangdaApplication\(AppModule\)/);
|
|
12
|
+
assert.doesNotMatch(main, /NestFactory|FastifyAdapter/);
|
|
13
|
+
const legacyMarkers = ['oauth' + 'Client', 'Workflow', 'instrument' + '-context'];
|
|
14
|
+
assert.doesNotMatch(source, new RegExp(legacyMarkers.join('|')));
|
|
15
|
+
assert.doesNotMatch(source, /createData|updateData|deleteData|queryData/);
|
|
16
|
+
});
|
|
@@ -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,146 @@
|
|
|
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
|
+
AppearanceProvider,
|
|
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
|
+
generated: true,
|
|
39
|
+
fields: {
|
|
40
|
+
text_short: {
|
|
41
|
+
label: '标题',
|
|
42
|
+
type: 'text.short',
|
|
43
|
+
widget: 'text',
|
|
44
|
+
requiredHint: true,
|
|
45
|
+
maxLength: 120,
|
|
46
|
+
list: true,
|
|
47
|
+
searchable: true,
|
|
48
|
+
sortable: true,
|
|
49
|
+
...fieldCapabilities(),
|
|
50
|
+
},
|
|
51
|
+
option_single: {
|
|
52
|
+
label: '单选快照',
|
|
53
|
+
type: 'option.single',
|
|
54
|
+
widget: 'radio',
|
|
55
|
+
options: [
|
|
56
|
+
{ label: 'Open', value: 'open' },
|
|
57
|
+
{ label: 'Closed', value: 'closed' },
|
|
58
|
+
],
|
|
59
|
+
list: true,
|
|
60
|
+
...fieldCapabilities(),
|
|
61
|
+
},
|
|
62
|
+
option_multiple: {
|
|
63
|
+
label: '多选快照',
|
|
64
|
+
type: 'option.multiple',
|
|
65
|
+
widget: 'checkbox',
|
|
66
|
+
options: [
|
|
67
|
+
{ label: 'Open', value: 'open' },
|
|
68
|
+
{ label: 'Urgent', value: 'urgent' },
|
|
69
|
+
],
|
|
70
|
+
list: true,
|
|
71
|
+
...fieldCapabilities(),
|
|
72
|
+
},
|
|
73
|
+
location_value: {
|
|
74
|
+
label: '精确定位',
|
|
75
|
+
type: 'location',
|
|
76
|
+
widget: 'location',
|
|
77
|
+
list: true,
|
|
78
|
+
...fieldCapabilities(),
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
list: {
|
|
82
|
+
defaultPageSize: 20,
|
|
83
|
+
searchableFields: ['text_short'],
|
|
84
|
+
filterFields: ['option_single'],
|
|
85
|
+
defaultSort: { field: 'text_short', order: 'asc' },
|
|
86
|
+
},
|
|
87
|
+
form: { layout: 'sections' },
|
|
88
|
+
detail: { layout: 'sections' },
|
|
89
|
+
mobile: { enabled: true },
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
const definitions = { [code]: liveDefinition };
|
|
94
|
+
const provider = createApplicationProvider(definitions);
|
|
95
|
+
const initialPath =
|
|
96
|
+
new URLSearchParams(window.location.search).get('initial') || `/${code}`;
|
|
97
|
+
|
|
98
|
+
function resourcePage(mode: 'list' | 'create' | 'edit' | 'detail') {
|
|
99
|
+
return (
|
|
100
|
+
<GeneratedResourcePage
|
|
101
|
+
definition={liveDefinition}
|
|
102
|
+
mode={mode}
|
|
103
|
+
resourceCode={code}
|
|
104
|
+
/>
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
ReactDOM.createRoot(document.getElementById('root')!).render(
|
|
109
|
+
<React.StrictMode>
|
|
110
|
+
<OpenXiangdaResourceDefinitionsProvider definitions={definitions}>
|
|
111
|
+
<AppearanceProvider>
|
|
112
|
+
<AntdApp>
|
|
113
|
+
<RuntimeBoundary>
|
|
114
|
+
<MemoryRouter initialEntries={[initialPath]}>
|
|
115
|
+
<Refine
|
|
116
|
+
dataProvider={provider}
|
|
117
|
+
resources={[
|
|
118
|
+
{
|
|
119
|
+
name: code,
|
|
120
|
+
list: `/${code}`,
|
|
121
|
+
create: `/${code}/new`,
|
|
122
|
+
edit: `/${code}/:id/edit`,
|
|
123
|
+
show: `/${code}/:id`,
|
|
124
|
+
},
|
|
125
|
+
]}
|
|
126
|
+
>
|
|
127
|
+
<Routes>
|
|
128
|
+
<Route path={`/${code}`} element={resourcePage('list')} />
|
|
129
|
+
<Route path={`/${code}/new`} element={resourcePage('create')} />
|
|
130
|
+
<Route
|
|
131
|
+
path={`/${code}/:id`}
|
|
132
|
+
element={resourcePage('detail')}
|
|
133
|
+
/>
|
|
134
|
+
<Route
|
|
135
|
+
path={`/${code}/:id/edit`}
|
|
136
|
+
element={resourcePage('edit')}
|
|
137
|
+
/>
|
|
138
|
+
</Routes>
|
|
139
|
+
</Refine>
|
|
140
|
+
</MemoryRouter>
|
|
141
|
+
</RuntimeBoundary>
|
|
142
|
+
</AntdApp>
|
|
143
|
+
</AppearanceProvider>
|
|
144
|
+
</OpenXiangdaResourceDefinitionsProvider>
|
|
145
|
+
</React.StrictMode>
|
|
146
|
+
);
|